class Ideone {
public static void main
(String[] args
) { printWithThreadNamePrefix("Start");
waiter.start();
// Give waiter some time to a) start and b) acquire the intrinsic lock
try {
}
notifier.start();
while (true) {
try {
waiter.join();
break;
}
}
printWithThreadNamePrefix("End");
}
private static void waiter() {
synchronized (lock) {
printWithThreadNamePrefix("Waiting...");
while (true) {
try {
lock.wait();
break;
}
}
printWithThreadNamePrefix("... done waiting");
}
}
private static void printWithThreadNamePrefix
(String msg
) { "%s: %s",
Thread.
currentThread().
getName(),
msg));
}
private static void notifier() {
synchronized (lock) {
printWithThreadNamePrefix("notifying");
lock.notify();
while (true) {
}
}
}
}
Y2xhc3MgSWRlb25lIHsKICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgbG9jayA9IG5ldyBPYmplY3QoKTsKCiAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgcHJpbnRXaXRoVGhyZWFkTmFtZVByZWZpeCgiU3RhcnQiKTsKICAgIFRocmVhZCB3YWl0ZXIgPSBuZXcgVGhyZWFkKElkZW9uZTo6d2FpdGVyKTsKICAgIHdhaXRlci5zdGFydCgpOwoKICAgIC8vIEdpdmUgd2FpdGVyIHNvbWUgdGltZSB0byBhKSBzdGFydCBhbmQgYikgYWNxdWlyZSB0aGUgaW50cmluc2ljIGxvY2sKICAgIHRyeSB7CiAgICAgIFRocmVhZC5zbGVlcCg1MDApOwogICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewogICAgfQoKICAgIGZpbmFsIFRocmVhZCBub3RpZmllciA9IG5ldyBUaHJlYWQoSWRlb25lOjpub3RpZmllcik7CiAgICBub3RpZmllci5zdGFydCgpOwoKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIHRyeSB7CiAgICAgICAgd2FpdGVyLmpvaW4oKTsKICAgICAgICBicmVhazsKICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewogICAgICB9CiAgICB9CgogICAgcHJpbnRXaXRoVGhyZWFkTmFtZVByZWZpeCgiRW5kIik7CiAgfQoKICBwcml2YXRlIHN0YXRpYyB2b2lkIHdhaXRlcigpIHsKICAgIHN5bmNocm9uaXplZCAobG9jaykgewogICAgICBwcmludFdpdGhUaHJlYWROYW1lUHJlZml4KCJXYWl0aW5nLi4uIik7CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGxvY2sud2FpdCgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewogICAgICAgIH0KICAgICAgfQogICAgICBwcmludFdpdGhUaHJlYWROYW1lUHJlZml4KCIuLi4gZG9uZSB3YWl0aW5nIik7CiAgICB9CiAgfQoKICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50V2l0aFRocmVhZE5hbWVQcmVmaXgoU3RyaW5nIG1zZykgewogICAgU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoCiAgICAgICAgIiVzOiAlcyIsCiAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCksCiAgICAgICAgbXNnKSk7CiAgfQoKICBwcml2YXRlIHN0YXRpYyB2b2lkIG5vdGlmaWVyKCkgewogICAgc3luY2hyb25pemVkIChsb2NrKSB7CiAgICAgIHByaW50V2l0aFRocmVhZE5hbWVQcmVmaXgoIm5vdGlmeWluZyIpOwogICAgICBsb2NrLm5vdGlmeSgpOwogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICB9CiAgICB9CiAgfQp9