/* 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