001 package com.croftsoft.core.util.queue; 002 003 import java.io.Serializable; 004 import java.util.*; 005 006 import com.croftsoft.core.lang.NullArgumentException; 007 008 /********************************************************************* 009 * An implementation of Queue that relies upon a List backbone. 010 * 011 * @version 012 * 2003-06-06 013 * @since 014 * 1999-02-07 015 * @author 016 * <a href="https://www.croftsoft.com/">David Wallace Croft</a> 017 *********************************************************************/ 018 019 public final class ListQueue 020 implements Queue, Serializable 021 ////////////////////////////////////////////////////////////////////// 022 ////////////////////////////////////////////////////////////////////// 023 { 024 025 private static final long serialVersionUID = 0L; 026 027 // 028 029 private final List list; 030 031 private final int maxSize; 032 033 ////////////////////////////////////////////////////////////////////// 034 ////////////////////////////////////////////////////////////////////// 035 036 public ListQueue ( 037 List list, 038 int maxSize ) 039 ////////////////////////////////////////////////////////////////////// 040 { 041 NullArgumentException.check ( this.list = list ); 042 043 this.maxSize = maxSize; 044 } 045 046 public ListQueue ( List list ) 047 ////////////////////////////////////////////////////////////////////// 048 { 049 this ( list, Integer.MAX_VALUE ); 050 } 051 052 public ListQueue ( ) 053 ////////////////////////////////////////////////////////////////////// 054 { 055 this ( new LinkedList ( ) ); 056 } 057 058 ////////////////////////////////////////////////////////////////////// 059 ////////////////////////////////////////////////////////////////////// 060 061 public boolean append ( Object o ) 062 ////////////////////////////////////////////////////////////////////// 063 { 064 NullArgumentException.check ( o ); 065 066 synchronized ( list ) 067 { 068 if ( list.size ( ) < maxSize ) 069 { 070 list.add ( o ); 071 072 list.notifyAll ( ); 073 074 return true; 075 } 076 } 077 078 return false; 079 } 080 081 public Object poll ( ) 082 ////////////////////////////////////////////////////////////////////// 083 { 084 synchronized ( list ) 085 { 086 if ( list.size ( ) > 0 ) 087 { 088 return list.remove ( 0 ); 089 } 090 } 091 092 return null; 093 } 094 095 public Object pull ( ) 096 throws InterruptedException 097 ////////////////////////////////////////////////////////////////////// 098 { 099 return pull ( 0 ); 100 } 101 102 public Object pull ( long timeout ) 103 throws InterruptedException 104 ////////////////////////////////////////////////////////////////////// 105 { 106 if ( timeout < 0 ) 107 { 108 throw new IllegalArgumentException ( "timeout < 0" ); 109 } 110 111 long stopTime = System.currentTimeMillis ( ) + timeout; 112 113 Object o = null; 114 115 while ( ( o = poll ( ) ) == null ) 116 { 117 if ( timeout == 0 ) 118 { 119 synchronized ( list ) 120 { 121 list.wait ( ); 122 } 123 } 124 else 125 { 126 long nowTime = System.currentTimeMillis ( ); 127 128 if ( stopTime > nowTime ) 129 { 130 synchronized ( list ) 131 { 132 list.wait ( stopTime - nowTime ); 133 } 134 } 135 else 136 { 137 break; 138 } 139 } 140 } 141 142 return o; 143 } 144 145 public Object replace ( Object o ) 146 throws IndexOutOfBoundsException 147 ////////////////////////////////////////////////////////////////////// 148 { 149 synchronized ( list ) 150 { 151 int index = list.indexOf ( o ); 152 153 if ( index < 0 ) 154 { 155 if ( append ( o ) ) 156 { 157 return null; 158 } 159 160 throw new IndexOutOfBoundsException ( ); 161 } 162 else 163 { 164 return list.set ( index, o ); 165 } 166 } 167 } 168 169 ////////////////////////////////////////////////////////////////////// 170 ////////////////////////////////////////////////////////////////////// 171 }