/* 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);
cons.run();
prod.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+KCksIDUpOwoJCQoJCVRocmVhZCBwcm9kID0gbmV3IFRocmVhZChuZXcgUHJvZHVjZXIoYnVmKSk7CgkJVGhyZWFkIGNvbnMgPSBuZXcgVGhyZWFkKG5ldyBDb25zdW1lcihidWYpKTsKCQkKCQljb25zLnJ1bigpOwoJCXByb2QucnVuKCk7CgkJCQkKCX0KCQoJcHJpdmF0ZSBjbGFzcyBDb25zdW1lciBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKCQlwcml2YXRlIER1bW15QnVmZmVyPFN0cmluZz4gYnVmOwoJCQoJCXB1YmxpYyBDb25zdW1lcihEdW1teUJ1ZmZlcjxTdHJpbmc+IGJ1ZikgewoJCQl0aGlzLmJ1ZiA9IGJ1ZjsKCQl9CgkJCgkJQE92ZXJyaWRlCgkJcHVibGljIHZvaWQgcnVuKCkgewoJCQlidWYudGFrZSgpOwoJCX0KCX0KCXByaXZhdGUgY2xhc3MgUHJvZHVjZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7CgkJcHJpdmF0ZSBEdW1teUJ1ZmZlcjxTdHJpbmc+IGJ1ZjsKCQkKCQlwdWJsaWMgUHJvZHVjZXIoRHVtbXlCdWZmZXI8U3RyaW5nPiBidWYpIHsKCQkJdGhpcy5idWYgPSBidWY7CgkJfQoJCQoJCUBPdmVycmlkZQoJCXB1YmxpYyB2b2lkIHJ1bigpIHsKCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9kdWNlciB0aGVyZS4uLiIpOwoJCQlidWYucHV0KCJIZWxsbyBXb3JsZCEiKTsKCQl9Cgl9CgkKCXByaXZhdGUgY2xhc3MgRHVtbXlCdWZmZXI8VD4gewoJCXByaXZhdGUgZmluYWwgaW50IFNJWkU7CgkJcHJpdmF0ZSBMaXN0PFQ+IGRhdGE7CgkJCgkJcHVibGljIER1bW15QnVmZmVyKExpc3Q8VD4gc2hhcmVkRGF0YSwgaW50IG1heFNpemUpIHsKCQkJU0laRSA9IG1heFNpemU7CgkJCWRhdGEgPSBzaGFyZWREYXRhOwoJCX0KCQkKCQlwdWJsaWMgc3luY2hyb25pemVkIFQgdGFrZSgpIHsKCQkJd2hpbGUgKGRhdGEuaXNFbXB0eSgpKSB7CgkJCQl0cnkgewoJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigid2FpdGluZy4uLiBmb3IgdGFraW5nIik7CgkJCQkJd2FpdCgpOwoJCQkJfQoJCQkJY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKCQkJCQkvLyBEbyBub3RoaW5nCgkJCQl9CgkJCX0KCQkJVCBpdGVtID0gZGF0YS5yZW1vdmUoZGF0YS5zaXplKCkgLSAxKTsKCQkJCgkJCW5vdGlmeUFsbCgpOwoJCQkKCQkJU3lzdGVtLm91dC5wcmludGxuKCJSZW1vdmVkIGl0ZW06ICIgKyBpdGVtKTsKCQkJcmV0dXJuIGl0ZW07CgkJfQoJCQoJCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBwdXQoVCBpdGVtKSB7CgkJCXdoaWxlIChkYXRhLnNpemUoKSA+PSBTSVpFKSB7CgkJCQl0cnkgewoJCQkJCXdhaXQoKTsKCQkJCX0KCQkJCWNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CgkJCQkJLy8gRG8gbm90aGluZwoJCQkJfQoJCQl9CgkJCWRhdGEuYWRkKGl0ZW0pOwoJCQkKCQkJU3lzdGVtLm91dC5wcmludGxuKCJub3RpZmllZCIpOwoJCQlub3RpZnlBbGwoKTsKCQkJCgkJCVN5c3RlbS5vdXQucHJpbnRsbigiUHV0IGl0ZW06ICIgKyBpdGVtKTsKCQl9Cgl9Cn0=