import java.util.concurrent.LinkedBlockingQueue;
public class Main {
static LinkedBlockingQueue<Message> messageQueue = new LinkedBlockingQueue<>();
enum Message { END }
static class Thread1
implements Runnable { @Override
public void run() {
System.
out.
println("From thread1"); Main.messageQueue.add(Message.END);
}
}
static class Thread2
implements Runnable { @Override
public void run() {
System.
out.
println("From thread2"); Main.messageQueue.add(Message.END);
}
}
(new Thread(new Thread1
())).
start(); (new Thread(new Thread2
())).
start(); int endedThreads = 0;
while(true){
Message t = messageQueue.take();
if(t == Message.END) {
endedThreads += 1;
if(endedThreads == 2) {
break;
}
}
}
System.
out.
println("Quit program"); }
}
aW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWU7CgpwdWJsaWMgY2xhc3MgTWFpbiB7CiAgICBzdGF0aWMgTGlua2VkQmxvY2tpbmdRdWV1ZTxNZXNzYWdlPiBtZXNzYWdlUXVldWUgPSBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZTw+KCk7CgogICAgZW51bSBNZXNzYWdlIHsgRU5EIH0KCiAgICBzdGF0aWMgY2xhc3MgVGhyZWFkMSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKICAgICAgICBAT3ZlcnJpZGUKICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRnJvbSB0aHJlYWQxIik7CiAgICAgICAgICAgIE1haW4ubWVzc2FnZVF1ZXVlLmFkZChNZXNzYWdlLkVORCk7CiAgICAgICAgfQogICAgfQoKICAgIHN0YXRpYyBjbGFzcyBUaHJlYWQyIGltcGxlbWVudHMgUnVubmFibGUgewogICAgICAgIEBPdmVycmlkZQogICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGcm9tIHRocmVhZDIiKTsKICAgICAgICAgICAgTWFpbi5tZXNzYWdlUXVldWUuYWRkKE1lc3NhZ2UuRU5EKTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIGphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CiAgICAgICAgKG5ldyBUaHJlYWQobmV3IFRocmVhZDEoKSkpLnN0YXJ0KCk7CiAgICAgICAgKG5ldyBUaHJlYWQobmV3IFRocmVhZDIoKSkpLnN0YXJ0KCk7CiAgICAgICAgaW50IGVuZGVkVGhyZWFkcyA9IDA7CiAgICAgICAgd2hpbGUodHJ1ZSl7CiAgICAgICAgICAgIE1lc3NhZ2UgdCA9IG1lc3NhZ2VRdWV1ZS50YWtlKCk7CiAgICAgICAgICAgIGlmKHQgPT0gTWVzc2FnZS5FTkQpIHsKICAgICAgICAgICAgICAgIGVuZGVkVGhyZWFkcyArPSAxOwogICAgICAgICAgICAgICAgaWYoZW5kZWRUaHJlYWRzID09IDIpIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlF1aXQgcHJvZ3JhbSIpOwogICAgfQp9Cg==