fork download
  1. /* package whatever; // don't place package name! */
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. class Ideone {
  7. public static void main(String[] args) {
  8. new Ideone();
  9. }
  10.  
  11. public Ideone() {
  12. DummyBuffer<String> buf = new DummyBuffer<String>(new ArrayList<String>(), 5);
  13.  
  14. Thread prod = new Thread(new Producer(buf));
  15. Thread cons = new Thread(new Consumer(buf));
  16.  
  17. prod.run();
  18. cons.run();
  19. }
  20.  
  21. private class Consumer implements Runnable {
  22. private DummyBuffer<String> buf;
  23.  
  24. public Consumer(DummyBuffer<String> buf) {
  25. this.buf = buf;
  26. }
  27.  
  28. @Override
  29. public void run() {
  30. buf.take();
  31. }
  32. }
  33. private class Producer implements Runnable {
  34. private DummyBuffer<String> buf;
  35.  
  36. public Producer(DummyBuffer<String> buf) {
  37. this.buf = buf;
  38. }
  39.  
  40. @Override
  41. public void run() {
  42. System.out.println("Producer there...");
  43. buf.put("Hello World!");
  44. }
  45. }
  46.  
  47. private class DummyBuffer<T> {
  48. private final int SIZE;
  49. private List<T> data;
  50.  
  51. public DummyBuffer(List<T> sharedData, int maxSize) {
  52. SIZE = maxSize;
  53. data = sharedData;
  54. }
  55.  
  56. public synchronized T take() {
  57. while (data.isEmpty()) {
  58. try {
  59. System.out.println("waiting... for taking");
  60. wait();
  61. }
  62. // Do nothing
  63. }
  64. }
  65. T item = data.remove(data.size() - 1);
  66.  
  67. notifyAll();
  68.  
  69. System.out.println("Removed item: " + item);
  70. return item;
  71. }
  72.  
  73. public synchronized void put(T item) {
  74. while (data.size() >= SIZE) {
  75. try {
  76. wait();
  77. }
  78. // Do nothing
  79. }
  80. }
  81. data.add(item);
  82.  
  83. System.out.println("notified");
  84. notifyAll();
  85.  
  86. System.out.println("Put item: " + item);
  87. }
  88. }
  89. }
Success #stdin #stdout 0.07s 380160KB
stdin
Standard input is empty
stdout
Producer there...
notified
Put item: Hello World!
Removed item: Hello World!