Синхронизация на test.printAnotherMessage();
отсутствует, поэтому она будет выполнена сначала при условии правильного выбора времени.4 секунды - это много, и их должно быть достаточно.
synchronized (test) {
test.printAnotherMessage();
}
Thread.sleep
редко бывает хорошим вариантом.Более правильным способом было бы
Test test = new Test();
new Thread(() -> {
synchronized (test) {
test.printMessage();
test.notify();
}
}).start();
synchronized (test) {
test.wait();
test.printAnotherMessage();
}
Я играю в опасную игру здесь, поскольку я предполагаю, что основной поток войдет в синхронизированный блок и выполнит wait()
до того, как будет создан другой поток.и он входит в свой синхронизированный блок.Это разумно, поскольку создание потока займет некоторое время .
Test test = new Test();
new Thread(() -> {
try {
// a lot of time to let the main thread execute wait()
Thread.sleep(500);
synchronized (test) {
test.printMessage();
test.notify();
}
} catch (InterruptedException e) {}
}).start();
synchronized (test) {
test.wait();
test.printAnotherMessage();
}