#java #multithreading
Вопрос:
Насколько я знаю, при вызове метода wait() поток будет бесконечно ждать, пока поток не вызовет метод notify() или notifyAll (). Но для приведенного ниже кода метод notify() вызывается до метода wait (), но поток B все равно получает блокировку и выполняется, затем продолжайте возвращаться к потоку A, чтобы получить блокировку и выполнить. Почему при вызове notify() перед ожиданием() метод notify() не игнорируется? Поток по-прежнему освобождает блокировку, а ожидающий поток по-прежнему получает блокировку и выполняет
в результате получается:
A == 1
B == 2
A == 3
B == 4
A == 5
B == 6
A == 7
B == 8
A == 9
B == 10
Извините, я новичок, надеюсь, кто-нибудь мне поможет. Спасибо
public class PrintNumber implements Runnable {
private int num = 1;
private boolean condition=true;
@Override
public void run() {
while(condition){
synchronized (this){
this.notify();
if(num <= 10){
System.out.println(Thread.currentThread().getName() " == " num);
num ;
}else{
condition=false;
}
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
PrintNumber print = new PrintNumber();
Thread thread1 = new Thread(print,"A");
Thread thread2 = new Thread(print,"B");
thread1.start();
thread2.start();
}
}
Комментарии:
1.Только самый первый
notify
ничего не делает, остальные работают нормально: когда поток X выполняет anotify
и после того, как он освободит монитор (покинет синхронизированный блок или вызоветwait
), поток Y покинетwait
и получит монитор.