class Main {
static class Callee {
public void call
() { System.
out.
println("Method called"); }
public Callee() {
System.
out.
println("I am constructed!"); }
}
static class Creator
implements Runnable { public Callee callee = null;
public void run() { callee = new Callee(); }
}
static class Caller
implements Runnable { private Creator creator;
public Caller(Creator creator) { this.creator = creator; }
public void run() {
while (creator.callee == null);
creator.callee.call();
}
}
public static void main
(String...
args) { Creator creator = new Creator();
new Thread(new Caller
(creator
)).
start(); }
}
Y2xhc3MgTWFpbiB7CgogIHN0YXRpYyBjbGFzcyBDYWxsZWUgewogICAgcHVibGljIHZvaWQgY2FsbCgpIHsgU3lzdGVtLm91dC5wcmludGxuKCJNZXRob2QgY2FsbGVkIik7IH0KCiAgICBwdWJsaWMgQ2FsbGVlKCkgewogICAgICB0cnkge1RocmVhZC5zbGVlcCgxMDAwKTt9IGNhdGNoIChFeGNlcHRpb24gZSkge30KICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJIGFtIGNvbnN0cnVjdGVkISIpOwogICAgfQogIH0KCiAgc3RhdGljIGNsYXNzIENyZWF0b3IgaW1wbGVtZW50cyBSdW5uYWJsZSB7CiAgICBwdWJsaWMgQ2FsbGVlIGNhbGxlZSA9IG51bGw7CgogICAgcHVibGljIHZvaWQgcnVuKCkgeyBjYWxsZWUgPSBuZXcgQ2FsbGVlKCk7IH0KICB9CgogIHN0YXRpYyBjbGFzcyBDYWxsZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7CiAgICBwcml2YXRlIENyZWF0b3IgY3JlYXRvcjsKCiAgICBwdWJsaWMgQ2FsbGVyKENyZWF0b3IgY3JlYXRvcikgeyB0aGlzLmNyZWF0b3IgPSBjcmVhdG9yOyB9CgogICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICB3aGlsZSAoY3JlYXRvci5jYWxsZWUgPT0gbnVsbCk7CiAgICAgIGNyZWF0b3IuY2FsbGVlLmNhbGwoKTsKICAgIH0KICB9CgogIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZy4uLiBhcmdzKSB7CiAgICBDcmVhdG9yIGNyZWF0b3IgPSBuZXcgQ3JlYXRvcigpOwogICAgbmV3IFRocmVhZChjcmVhdG9yKS5zdGFydCgpOwogICAgbmV3IFRocmVhZChuZXcgQ2FsbGVyKGNyZWF0b3IpKS5zdGFydCgpOwogIH0KfQ==