- /* package whatever; // don't place package name! */ 
-   
- import java.util.ArrayList; 
- import java.util.List; 
-   
- class Ideone { 
- 	public static void-  main (String[]-  args ) {
 
- 		new Ideone(); 
- 	} 
-   
- 	public Ideone() { 
- 		DummyBuffer<String> buf = new DummyBuffer<String>(new ArrayList<String>(), 5); 
-   
-   
- 		prod.run(); 
- 		cons.run(); 
- 	} 
-   
- 	private class-  Consumer  implements Runnable {
 
- 		private DummyBuffer<String> buf; 
-   
- 		public Consumer(DummyBuffer<String> buf) { 
- 			this.buf = buf; 
- 		} 
-   
- 		@Override 
- 		public void run() { 
- 			buf.take(); 
- 		} 
- 	} 
- 	private class-  Producer  implements Runnable {
 
- 		private DummyBuffer<String> buf; 
-   
- 		public Producer(DummyBuffer<String> buf) { 
- 			this.buf = buf; 
- 		} 
-   
- 		@Override 
- 		public void run() { 
- 			System- . out- . println("Producer there...");
 
- 			buf.put("Hello World!"); 
- 		} 
- 	} 
-   
- 	private class DummyBuffer<T> { 
- 		private final int SIZE; 
- 		private List<T> data; 
-   
- 		public DummyBuffer(List<T> sharedData, int maxSize) { 
- 			SIZE = maxSize; 
- 			data = sharedData; 
- 		} 
-   
- 		public synchronized T take() { 
- 			while (data.isEmpty()) { 
- 				try { 
- 					System- . out- . println("waiting... for taking");
 
- 					wait(); 
- 				} 
- 					// Do nothing 
- 				} 
- 			} 
- 			T item = data.remove(data.size() - 1); 
-   
- 			notifyAll(); 
-   
- 			System- . out- . println("Removed item: " +-  item );
 
- 			return item; 
- 		} 
-   
- 		public synchronized void put(T item) { 
- 			while (data.size() >= SIZE) { 
- 				try { 
- 					wait(); 
- 				} 
- 					// Do nothing 
- 				} 
- 			} 
- 			data.add(item); 
-   
- 			System- . out- . println("notified");
 
- 			notifyAll(); 
-   
- 			System- . out- . println("Put item: " +-  item );
 
- 		} 
- 	} 
- } 
				LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKCmNsYXNzIElkZW9uZSB7CglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CgkJbmV3IElkZW9uZSgpOwoJfQoJCglwdWJsaWMgSWRlb25lKCkgewoJCUR1bW15QnVmZmVyPFN0cmluZz4gYnVmID0gbmV3IER1bW15QnVmZmVyPFN0cmluZz4obmV3IEFycmF5TGlzdDxTdHJpbmc+KCksIDUpOwoJCQoJCVRocmVhZCBwcm9kID0gbmV3IFRocmVhZChuZXcgUHJvZHVjZXIoYnVmKSk7CgkJVGhyZWFkIGNvbnMgPSBuZXcgVGhyZWFkKG5ldyBDb25zdW1lcihidWYpKTsKCQkKCQlwcm9kLnJ1bigpOwoJCWNvbnMucnVuKCk7Cgl9CgkKCXByaXZhdGUgY2xhc3MgQ29uc3VtZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7CgkJcHJpdmF0ZSBEdW1teUJ1ZmZlcjxTdHJpbmc+IGJ1ZjsKCQkKCQlwdWJsaWMgQ29uc3VtZXIoRHVtbXlCdWZmZXI8U3RyaW5nPiBidWYpIHsKCQkJdGhpcy5idWYgPSBidWY7CgkJfQoJCQoJCUBPdmVycmlkZQoJCXB1YmxpYyB2b2lkIHJ1bigpIHsKCQkJYnVmLnRha2UoKTsKCQl9Cgl9Cglwcml2YXRlIGNsYXNzIFByb2R1Y2VyIGltcGxlbWVudHMgUnVubmFibGUgewoJCXByaXZhdGUgRHVtbXlCdWZmZXI8U3RyaW5nPiBidWY7CgkJCgkJcHVibGljIFByb2R1Y2VyKER1bW15QnVmZmVyPFN0cmluZz4gYnVmKSB7CgkJCXRoaXMuYnVmID0gYnVmOwoJCX0KCQkKCQlAT3ZlcnJpZGUKCQlwdWJsaWMgdm9pZCBydW4oKSB7CgkJCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvZHVjZXIgdGhlcmUuLi4iKTsKCQkJYnVmLnB1dCgiSGVsbG8gV29ybGQhIik7CgkJfQoJfQoJCglwcml2YXRlIGNsYXNzIER1bW15QnVmZmVyPFQ+IHsKCQlwcml2YXRlIGZpbmFsIGludCBTSVpFOwoJCXByaXZhdGUgTGlzdDxUPiBkYXRhOwoJCQoJCXB1YmxpYyBEdW1teUJ1ZmZlcihMaXN0PFQ+IHNoYXJlZERhdGEsIGludCBtYXhTaXplKSB7CgkJCVNJWkUgPSBtYXhTaXplOwoJCQlkYXRhID0gc2hhcmVkRGF0YTsKCQl9CgkJCgkJcHVibGljIHN5bmNocm9uaXplZCBUIHRha2UoKSB7CgkJCXdoaWxlIChkYXRhLmlzRW1wdHkoKSkgewoJCQkJdHJ5IHsKCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIndhaXRpbmcuLi4gZm9yIHRha2luZyIpOwoJCQkJCXdhaXQoKTsKCQkJCX0KCQkJCWNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CgkJCQkJLy8gRG8gbm90aGluZwoJCQkJfQoJCQl9CgkJCVQgaXRlbSA9IGRhdGEucmVtb3ZlKGRhdGEuc2l6ZSgpIC0gMSk7CgkJCQoJCQlub3RpZnlBbGwoKTsKCQkJCgkJCVN5c3RlbS5vdXQucHJpbnRsbigiUmVtb3ZlZCBpdGVtOiAiICsgaXRlbSk7CgkJCXJldHVybiBpdGVtOwoJCX0KCQkKCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcHV0KFQgaXRlbSkgewoJCQl3aGlsZSAoZGF0YS5zaXplKCkgPj0gU0laRSkgewoJCQkJdHJ5IHsKCQkJCQl3YWl0KCk7CgkJCQl9CgkJCQljYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewoJCQkJCS8vIERvIG5vdGhpbmcKCQkJCX0KCQkJfQoJCQlkYXRhLmFkZChpdGVtKTsKCQkJCgkJCVN5c3RlbS5vdXQucHJpbnRsbigibm90aWZpZWQiKTsKCQkJbm90aWZ5QWxsKCk7CgkJCQoJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlB1dCBpdGVtOiAiICsgaXRlbSk7CgkJfQoJfQp9