import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class Main
{
{
CountDownLatch latch = new CountDownLatch(3);
ExecutorService exec = Executors.newCachedThreadPool();
exec.execute(new WaitingTask(latch));
exec.execute(new Workers(latch,1));
exec.execute(new Workers(latch,2));
exec.execute(new Workers(latch,3));
}
}
private CountDownLatch latch;
public WaitingTask(CountDownLatch latch) {
this.latch = latch;
}
public void run() {
try {
System.
out.
println(this + ": waiting for other tasks to end"); latch.await();
System.
out.
println(this + ": I AM FREE!!!"); //TODO
}
}
return "WaitingTask";
}
}
private final int id;
private CountDownLatch latch;
public Workers(CountDownLatch latch, int id) {
this.latch = latch;
this.id = id;
}
public void run() {
try {
System.
out.
println(this + ": doing some work"); TimeUnit.MILLISECONDS.sleep(random.nextInt(2000));
latch.countDown();
//TODO
}
}
return String.
format("Worker %3d", id
); }
}
aW1wb3J0IGphdmEudXRpbC5SYW5kb207CmltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwoKcHVibGljIGNsYXNzIE1haW4KewoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCgl7CgkJQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMyk7CgkJRXhlY3V0b3JTZXJ2aWNlIGV4ZWMgPSBFeGVjdXRvcnMubmV3Q2FjaGVkVGhyZWFkUG9vbCgpOwoKCQlleGVjLmV4ZWN1dGUobmV3IFdhaXRpbmdUYXNrKGxhdGNoKSk7CgoJCWV4ZWMuZXhlY3V0ZShuZXcgV29ya2VycyhsYXRjaCwxKSk7CgkJZXhlYy5leGVjdXRlKG5ldyBXb3JrZXJzKGxhdGNoLDIpKTsKCQlleGVjLmV4ZWN1dGUobmV3IFdvcmtlcnMobGF0Y2gsMykpOwoKCX0KfQoKY2xhc3MgV2FpdGluZ1Rhc2sgaW1wbGVtZW50cyBSdW5uYWJsZSB7Cglwcml2YXRlIENvdW50RG93bkxhdGNoIGxhdGNoOwoKCXB1YmxpYyBXYWl0aW5nVGFzayhDb3VudERvd25MYXRjaCBsYXRjaCkgewoJCXRoaXMubGF0Y2ggPSBsYXRjaDsKCX0KCglwdWJsaWMgdm9pZCBydW4oKSB7CgkJdHJ5IHsKCQkJU3lzdGVtLm91dC5wcmludGxuKHRoaXMgKyAiOiB3YWl0aW5nIGZvciBvdGhlciB0YXNrcyB0byBlbmQiKTsKCQkJbGF0Y2guYXdhaXQoKTsKCQkJU3lzdGVtLm91dC5wcmludGxuKHRoaXMgKyAiOiBJIEFNIEZSRUUhISEiKTsKCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CgkJCS8vVE9ETwoJCX0KCX0KCglwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewoJCXJldHVybiAiV2FpdGluZ1Rhc2siOwoJfQp9CgpjbGFzcyBXb3JrZXJzIGltcGxlbWVudHMgUnVubmFibGUgewoJcHJpdmF0ZSBSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbSgpOwoJcHJpdmF0ZSBmaW5hbCBpbnQgaWQ7Cglwcml2YXRlIENvdW50RG93bkxhdGNoIGxhdGNoOwoKCXB1YmxpYyBXb3JrZXJzKENvdW50RG93bkxhdGNoIGxhdGNoLCBpbnQgaWQpIHsKCQl0aGlzLmxhdGNoID0gbGF0Y2g7CgkJdGhpcy5pZCA9IGlkOwoJfQoKCXB1YmxpYyB2b2lkIHJ1bigpIHsKCQl0cnkgewoJCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcyArICI6IGRvaW5nIHNvbWUgd29yayIpOwoJCQlUaW1lVW5pdC5NSUxMSVNFQ09ORFMuc2xlZXAocmFuZG9tLm5leHRJbnQoMjAwMCkpOwoKCQkJbGF0Y2guY291bnREb3duKCk7CgkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewoJCQkvL1RPRE8KCQl9Cgl9CgoJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKCQlyZXR1cm4gU3RyaW5nLmZvcm1hdCgiV29ya2VyICUzZCIsIGlkKTsKCX0KfQ==