[英]wait() does not force the thread to wait?
我有兩個線程t0和t1,它們的可運行對象分別在下面的代碼部分Run_0和Run1中發布。 我想做的是,當t0正在編寫或執行持續7秒的任務時,t1應該正在等待。 並且在7秒鍾過后,應通知t1繼續工作。 我嘗試使用wait()和notify()做到這一點,但在運行時我希望t0啟動,但控制台僅顯示“ T1正在運行”,而t0卻什么也不顯示,好像沒有啟動
請讓我知道為什么發生這種情況。
代碼 :
public static void main(String[] args) {
t0 = new Thread(new Run_0());
t1 = new Thread(new Run_1());
t0.start();
t1.start();
}
private static class Run_0 implements Runnable {
public void run() {
// TODO Auto-generated method stub
while (true) {
long startTime = TimeUtils.getTSSec();
synchronized (t1) {
try {
t1.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("T0 is writing");
//simulate doing some work
while( (TimeUtils.getTSSec()-startTime) <= 7) {
}
System.out.println("T0 finished writing");
synchronized (t1) {
t1.notify();
}
startTime = TimeUtils.getTSSec();
while( (TimeUtils.getTSSec()-startTime) <= 7) {
}
}
}
}
private static class Run_1 implements Runnable {
public void run() {
// TODO Auto-generated method stub
while(true) {
System.out.println("T1 is working");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
wait
, notify
和notifyAll
應該在synchronized
塊內。 您有一個notify
位於其外部:
t1.notify(); // <-------
startTime = TimeUtils.getTSSec();
控制台僅顯示“ T1正在工作”,而t0則什么也不顯示,就好像它沒有啟動一樣
對,因為Run_0.run()
的第一件事是t1.wait();
。 那正在等待有人調用t1.notify()
或t1.notifyAll()
。 我看不到有人在叫那些。
當線程在對象上調用wait()
時,它將導致線程等待通知對象上的監視器。 一個線程不會導致另一個線程等待。 它只能等待自己。
重要的是要意識到您正在同步,等待和通知恰好是線程的t1
對象。 兩個線程之間共享的任何對象都可以使用,並且由於我們對鎖定t0
或t1
線程對象感到困惑,因此您應該創建一個最終的鎖定對象並對其進行鎖定:
private final Object lock = new Object();
t0正在寫或正在執行持續7秒鍾的任務,t1應該正在等待。
因此,聽起來您應該在Run_1
類而不是Run_0
類中使用t1.wait()
。 也許Run_0
應該這樣做:
// much better way to simulate time passing instead of a spin loop
Thread.sleep(7000);
System.out.println("T0 finished writing");
synchronized (lock) {
lock.notify();
}
然后在Run_1
您將執行以下操作:
synchronized (lock) {
lock.wait();
}
System.out.println("T1 is working");
請注意,我正在使用通用lock
對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.