簡體   English   中英

在線程程序中使用wait()時notify()語句的意義是什么

[英]What's the significance of notify() statement while using wait() in a threading programme

public class ThreadA {

    public static void main(String[] args) {
        ThreadB threadB = new ThreadB();
        threadB.start();
        synchronized (threadB) {
            try {
                threadB.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        System.out.println("the total is ====>"+threadB.total);

    }
}
class ThreadB extends Thread
{
    int total;
    public void run(){
        synchronized (this) {
            for(int i =0; i<5;i++)
            {
                System.out.println("lets add===>"+i);
                total+= i;
            }
            notify(); // line no.31
            System.out.println("after notify but within lock");

        }
        System.out.println("after notify but outside lock");

    }
}
output : 
lets add===>0
lets add===>1
lets add===>2
lets add===>3
lets add===>4
after notify but within lock
the total is ====>10
after notify but outside lock

我的問題:控件不應該在第31行之后立即回到“主”線程。 理想情況下,它不應該打印-在“ let add === >> 4”之后立即顯示“總數====> 10”嗎?

為什么不管第31行的notify()語句如何,它都執行同步塊中的所有語句?

最后幾行的順序將始終不相同。 這取決於線程的調度方式,並且無法保證,具體取決於您擁有的代碼。 執行完notify的那一刻, wait結束,因此任何線程都可以按任何順序運行。 但是after notify but within lockafter notify but within lock內,因此即使執行了主線程,其仍處於鎖定狀態,無法執行任何操作

我的問題:控件不應該在第31行之后立即回到“主”線程。

您要的是不可能的事情。 調用notify的線程仍在同步塊中。 另一個線程完成等待后,它又回到了同步塊中。 因此,您要的是將兩個線程同時放在同一對象的同步塊中,而這正是此類塊所禁止的。

    synchronized (threadB) {
        try {
            threadB.wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    System.out.println("the total is ====>"+threadB.total);

所以這段代碼做到了:

  1. 輸入同步塊。
  2. 呼叫wait
  3. 退出同步塊。
  4. 打印總計。

注意:

  1. 除非我們處於同步塊中,否則我們無法退出同步塊;

  2. wait返回之前,我們無法退出同步塊; 從而

  3. 我們不能從wait打印到不包含在同步塊中的總數,因此,當另一個線程保留在同步塊中時,我們就不能這樣做,否則同步塊中將同時有兩個線程。

現在看這段代碼:

        notify(); // line no.31
        System.out.println("after notify but within lock");
    } // exit synchronized block

因此,通知另一個線程的任何線程直到打印后才離開其同步塊。 因此,被通知的線程要等到打印后才能退出其同步塊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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