簡體   English   中英

在調用wait和notify之后,我嘗試從主線程加入兩個線程

[英]I try to join two threads from the main thread, after calling wait and notify

首先,我嘗試定義一個包含2個同步方法的類,第一個包含一個wait()調用,第二個包含notify()調用。

 class Xa {
 public synchronized void printX() {
    try {
        wait();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.out.println("XXX");
}

public synchronized void notifyX() {
    System.out.println("111");
    notify();
}
}

然后,我嘗試在主線程中創建兩個線程,第一個線程調用Xa類的對象的printX()方法,第二個線程調用同一對象的notifyX()方法,最后主線程加入兩個線程。

我用for循環重復這種情況

public class TryQ {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    Thread t1 = null;
    Thread t2 = null;
    for(int i=1 ; i<=100; i++) {
        Xa x = new Xa();

        t1 = new Thread() {
            @Override
            public void run() {
                x.printX();
            }
        };

        t2 = new Thread() {
            @Override
            public void run() {
                x.notifyX();
            }
        };

        t1.start();
        t2.start();

        try {
            t1.join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            t2.join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }       
}
}

問題是,在沒有連接的情況下,第一個和第二個線程都准確地打印了100次,但是當我嘗試通過主線程將它們連接時,我最多只能輸出2或3行...並且程序仍在運行!

為什么?

無論是否使用join存在問題。

問題是,如果t2首先執行notifyX

public synchronized void notifyX() {
    System.out.println("111");
    notify();
}

然后t1調用printXt1將永遠被阻塞!

public synchronized void printX() {
    try {
        wait();   <--- since t2 has finished, t1 will get stuck here!
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.out.println("XXX");
}

區別在於:

  • 如果沒有join ,盡管第一個t1被卡住,主線程將創建一個新的t1並運行。
  • 使用join ,因為第一個t1卡住了,所以join將阻塞主線程,因此不會有下一代。

暫無
暫無

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

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