ObjectFIFO.java
上传用户:songled
上传日期:2022-07-14
资源大小:94k
文件大小:3k
源码类别:

进程与线程

开发平台:

Java

  1. public class ObjectFIFO extends Object {
  2. private Object[] queue;
  3. private int capacity;
  4. private int size;
  5. private int head;
  6. private int tail;
  7. public ObjectFIFO(int cap) {
  8. capacity = ( cap > 0 ) ? cap : 1; // at least 1
  9. queue = new Object[capacity];
  10. head = 0;
  11. tail = 0;
  12. size = 0;
  13. }
  14. public int getCapacity() {
  15. return capacity;
  16. }
  17. public synchronized int getSize() {
  18. return size;
  19. }
  20. public synchronized boolean isEmpty() {
  21. return ( size == 0 );
  22. }
  23. public synchronized boolean isFull() {
  24. return ( size == capacity );
  25. }
  26. public synchronized void add(Object obj) 
  27. throws InterruptedException {
  28. waitWhileFull();
  29. queue[head] = obj;
  30. head = ( head + 1 ) % capacity;
  31. size++;
  32. notifyAll(); // let any waiting threads know about change
  33. }
  34. public synchronized void addEach(Object[] list) 
  35. throws InterruptedException {
  36. //
  37. // You might want to code a more efficient 
  38. // implementation here ... (see ByteFIFO.java)
  39. //
  40. for ( int i = 0; i < list.length; i++ ) {
  41. add(list[i]);
  42. }
  43. }
  44. public synchronized Object remove() 
  45. throws InterruptedException {
  46. waitWhileEmpty();
  47. Object obj = queue[tail];
  48. // don't block GC by keeping unnecessary reference
  49. queue[tail] = null; 
  50. tail = ( tail + 1 ) % capacity;
  51. size--;
  52. notifyAll(); // let any waiting threads know about change
  53. return obj;
  54. }
  55. public synchronized Object[] removeAll() 
  56. throws InterruptedException {
  57. //
  58. // You might want to code a more efficient 
  59. // implementation here ... (see ByteFIFO.java)
  60. //
  61. Object[] list = new Object[size]; // use the current size
  62. for ( int i = 0; i < list.length; i++ ) {
  63. list[i] = remove();
  64. }
  65. // if FIFO was empty, a zero-length array is returned
  66. return list; 
  67. }
  68. public synchronized Object[] removeAtLeastOne() 
  69. throws InterruptedException {
  70. waitWhileEmpty(); // wait for a least one to be in FIFO
  71. return removeAll();
  72. }
  73. public synchronized boolean waitUntilEmpty(long msTimeout) 
  74. throws InterruptedException {
  75. if ( msTimeout == 0L ) {
  76. waitUntilEmpty();  // use other method
  77. return true;
  78. }
  79. // wait only for the specified amount of time
  80. long endTime = System.currentTimeMillis() + msTimeout;
  81. long msRemaining = msTimeout;
  82. while ( !isEmpty() && ( msRemaining > 0L ) ) {
  83. wait(msRemaining);
  84. msRemaining = endTime - System.currentTimeMillis();
  85. }
  86. // May have timed out, or may have met condition, 
  87. // calc return value.
  88. return isEmpty();
  89. }
  90. public synchronized void waitUntilEmpty() 
  91. throws InterruptedException {
  92. while ( !isEmpty() ) {
  93. wait();
  94. }
  95. }
  96. public synchronized void waitWhileEmpty() 
  97. throws InterruptedException {
  98. while ( isEmpty() ) {
  99. wait();
  100. }
  101. }
  102. public synchronized void waitUntilFull() 
  103. throws InterruptedException {
  104. while ( !isFull() ) {
  105. wait();
  106. }
  107. }
  108. public synchronized void waitWhileFull() 
  109. throws InterruptedException {
  110. while ( isFull() ) {
  111. wait();
  112. }
  113. }
  114. }