[英]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
調用printX
, t1
將永遠被阻塞!
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.