Вы ожидаете и уведомляете различные объекты ( мониторы ).
Идея состоит в том, что вы можете позвонить obj.wait()
и ждать, пока кто-нибудь сделает obj.notify()
, пока вы делаете objA.wait()
и objB.notify()
.
Измените свой printOdd
метод на что-то вроде
private void printOdd(int i) {
synchronized (lock) { // <-------
while (!oddTurn) {
try {
lock.wait(); // <-------
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(type + i);
oddTurn = false;
lock.notifyAll(); // <-------
}
}
и метод printEven
аналогично.
Затем предоставьте NumberPrinter
объект lock
:
Object lock = new Object();
Thread odd = new Thread(new NumberPrinter("odd", lock));
Thread even = new Thread(new NumberPrinter("even", lock));
Выход:
odd1
even2
odd3
even4
odd5
even6
odd7
even8
odd9