我不熟悉Java併發。我有一個簡單的對象與3個方法,每個對應的代碼運行3個不同的線程。爲什麼notifyAll()語句在這種情況下不會釋放其他兩個線程中的等待?爲什麼notifyAll()在這種簡單情況下不能恢復其他線程?
public class Main {
static class Obj {
synchronized void t1() {
System.out.println("T1 ran");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
notifyAll();
}
synchronized void t2() {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("T2 ran");
}
synchronized void t3() {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("T3 ran");
}
}
public static void main(String[] args) {
final Obj o = new Obj();
new Thread(new Runnable() {
@Override
public void run() {
o.t1();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
o.t2();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
o.t3();
}
}).start();
}}
我預計: T1跑 ~~停頓1秒~~ T2跑 T3跑
我: T1跑
真棒謝謝! – 2014-11-08 21:29:31
@其他人:我只用包含方法't1,t2,t3'(Obj1,Obj2,Obj3)的3個不同的「對象」測試源代碼 - 結果是相同的。爲什麼在Obj1上的同步方法會阻止不同的線程分別訪問'Obj2.t2'和'Obj3.t3'? – dognose 2014-11-08 21:39:58
啊沒關係 - 其他方法已經被發現,但是。 'notifyAll'沒有影響,然後:-)所以其他對象線程正在等待,直到黎明:) – dognose 2014-11-08 21:47:16