簡體   English   中英

wait()是否不強制線程等待?

[英]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();
            }
        }
    }

}

javadocs (重點是我的):

使當前線程等待,直到另一個線程為此對象調用notify()方法或notifyAll()方法。

您的代碼使t0等待,而不是t1等待。

waitnotifynotifyAll應該在synchronized塊內。 您有一個notify位於其外部:

        t1.notify(); // <-------
        startTime = TimeUtils.getTSSec();

控制台僅顯示“ T1正在工作”,而t0則什么也不顯示,就好像它沒有啟動一樣

對,因為Run_0.run()的第一件事是t1.wait(); 那正在等待有人調用t1.notify()t1.notifyAll() 我看不到有人在叫那些。

當線程在對象上調用wait()時,它將導致線程等待通知對象上的監視器。 一個線程不會導致另一個線程等待。 它只能等待自己。

重要的是要意識到您正在同步,等待和通知恰好是線程的t1對象。 兩個線程之間共享的任何對象都可以使用,並且由於我們對鎖定t0t1線程對象感到困惑,因此您應該創建一個最終的鎖定對象並對其進行鎖定:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM