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

进程与线程

开发平台:

Java

  1. public class SimpleObjectFIFO extends Object {
  2. private Object[] queue;
  3. private int capacity;
  4. private int size;
  5. private int head;
  6. private int tail;
  7. public SimpleObjectFIFO(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 synchronized int getSize() {
  15. return size;
  16. }
  17. public synchronized boolean isFull() {
  18. return ( size == capacity );
  19. }
  20. public synchronized void add(Object obj) throws InterruptedException {
  21. while ( isFull() ) {
  22. wait();
  23. }
  24. queue[head] = obj;
  25. head = ( head + 1 ) % capacity;
  26. size++;
  27. notifyAll(); // let any waiting threads know about change
  28. }
  29. public synchronized Object remove() throws InterruptedException {
  30. while ( size == 0 ) {
  31. wait();
  32. }
  33. Object obj = queue[tail];
  34. queue[tail] = null; // don't block GC by keeping unnecessary reference
  35. tail = ( tail + 1 ) % capacity;
  36. size--;
  37. notifyAll(); // let any waiting threads know about change
  38. return obj;
  39. }
  40. public synchronized void printState() {
  41. StringBuffer sb = new StringBuffer();
  42. sb.append("SimpleObjectFIFO:n");
  43. sb.append("       capacity=" + capacity + "n");
  44. sb.append("           size=" + size);
  45. if ( isFull() ) {
  46. sb.append(" - FULL");
  47. } else if ( size == 0 ) {
  48. sb.append(" - EMPTY");
  49. }
  50. sb.append("n");
  51. sb.append("           head=" + head + "n");
  52. sb.append("           tail=" + tail + "n");
  53. for ( int i = 0; i < queue.length; i++ ) {
  54. sb.append("       queue[" + i + "]=" + queue[i] + "n");
  55. }
  56. System.out.print(sb);
  57. }
  58. }