Вы можете вызывать метод wait()
только для объектов, с которыми вы синхронизируете.
Итак, поскольку у вас есть synchronized (ThreadsTest.getInstance())
, вы должны написать ThreadsTest.getInstance().wait()
.
Не уверен, что именно вы пытаетесь здесь проверить, если это просто базовый пример синхронизации потоков, то вам следует изменить код на
public class ThreadsTest {
private static ThreadsTest instance;
public volatile boolean flag = false;
public void doStuff() {
System.out.println("first");
this.flag = true;
synchronized (getInstance()) {
getInstance().notifyAll();
}
}
public Runnable mDrawer = new Runnable() {
public void run() {
synchronized (ThreadsTest.getInstance()) {
while (flag == false)
try {
ThreadsTest.getInstance().wait();
} catch (InterruptedException ie) {
System.out.println("second");
}
}
}
};
public static ThreadsTest getInstance() {
if (ThreadsTest.instance == null) {
ThreadsTest.instance = new ThreadsTest();
}
return ThreadsTest.instance;
}
private ThreadsTest() {
}
public static void main(String[] args) throws InterruptedException {
ThreadsTest t = ThreadsTest.getInstance();
new Thread(t.mDrawer).start();
Thread.sleep(1000L); // let other thread start, so it won't skip our notify()
t.doStuff();
}
}