這個問題在這里已經有了答案: 理解 wait() 和 notify() 方法 2 個回答 1 小時前關閉。
我是 Java 多執行緒的新手,并撰寫了一個小程式來測驗 wait() 和 notifyAll() 方法如何相互互動。但是為什么這個程式不起作用?
package sample;
public class Main {
public static void main(String[] args) {
new Thread(new MyWriter()).start();
new Thread(new MyReader()).start();
}
}
class MyReader implements Runnable {
@Override
public synchronized void run() {
while(true) {
notifyAll();
}
}
}
class MyWriter implements Runnable {
@Override
public synchronized void run() {
while(true) {
try {
System.out.println("Waiting...");
wait();
System.out.println("Wait Terminated");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
運行時,我希望輸出為
Waiting...
Wait Terminated
但它輸出
Waiting...
并且永遠等待,直到我手動終止它。
uj5u.com熱心網友回復:
呼叫通知在notify物件監視器上等待的物件。所以,如果你wait在一個物件上發出,你必須notify使用同一個物件。
一種方法是簡單地使用共享物件:
public static void main(String[] args) {
Object lock=new Object();
new Thread(new MyWriter(lock)).start();
new Thread(new MyReader(lock)).start();
}
然后:
public void run() {
while(true) {
synchronized(lock) {
lock.notifyAll();
}
}
public void run() {
while(true) {
try {
synchronized(lock) {
System.out.println("Waiting...");
lock.wait();
System.out.println("Wait Terminated");
}
} ...
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/433403.html
上一篇:如何運行多個倒計時
