пример: wait()
и notify()
в Java Concurrency. Мои теоретические знания об этом не объясняют мне этот код, и я не могу объяснить, почему это дает мне непонятый результат.Как понять этот простой пример потока?
Итак, это код, чтобы получить представление:
public class ExampleOne {
public static void main(String[] args) {
Test b = new Test();
b.start();
synchronized(b){
try{
b.wait();
} catch(InterruptedException ex){
ex.printStackTrace();
}
System.out.println(b.total);
}
}
}
class Test extends Thread {
int total;
@Override
public void run(){
synchronized(this){
for(int i =0;i<50;i++){
total+=i;
System.out.println("I am here");
}
notify();
}
}
}
Результат: 4950
Итак, как понять этот процесс (как total
может быть 4950)?
Я понимаю, что если я звоню wait()
, он останавливает поток объекта, который вызвал этот метод, и разбудил его, затем другой поток вызывает notify()
. Кроме того, блок synchronized()
ограничивает потоки и принимает только один поток за один раз.
Поэтому, когда поток вызывает уведомит(), он становится неактивным, пока другие вызовы нити ждать()?
Как wait() и notify() играют свою роль в этом коде? Также
synchronized()
блок?Итак, сколько потоков создано в этом коде?
Я смущен об этом. Помогите мне разобраться.
'wait()' на объекте помещает вызывающий поток в состояние ожидания, пока на тот же объект не вызывается 'notify()' или 'notifyAll()'. Это не поток объектов. Это поток, который получает блокировку объекта и называет 'wait()' на нем. – ahanin
Остерегайтесь этого кода: если поток 'Test' вызывает' notify() 'перед тем, как основной поток вызывает' wait() ', основной поток будет ждать вечно. Я предлагаю вам переместить 'b.start' ** внутри **' synchronized (b) ', чтобы избежать этой потенциальной проблемы. – m0skit0