5 回答

TA貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超9個(gè)贊
實(shí)際上線程中不應(yīng)該有else,把else注釋掉就正確了。 如果加上else后,該線程會(huì)在wait后不再notify,導(dǎo)致另一個(gè)線程無限wait。
public class Test {
public static Object object = new Object();
public static boolean printA = true;
public static void main(String[] args) {
ThreadA threadA = new ThreadA();
threadA.start();
ThreadB threadB = new ThreadB();
threadB.start();
}
}
class ThreadA extends Thread {
@Override
public void run() {
for(int i = 0; i < 10; i++) {
synchronized (Test.object) {
if(!Test.printA) {
try {
Test.object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}/* else {*/
System.out.println("A");
Test.printA = false;
Test.object.notify();
/*}*/
}
}
}
}
class ThreadB extends Thread {
@Override
public void run() {
for(int i = 0; i < 10; i++) {
synchronized (Test.object) {
if(Test.printA) {
try {
Test.object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}/* else { */
System.out.println("B");
Test.printA = true;
Test.object.notify();
/*}*/
}
}
}
}

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊

TA貢獻(xiàn)1719條經(jīng)驗(yàn) 獲得超6個(gè)贊

TA貢獻(xiàn)1884條經(jīng)驗(yàn) 獲得超4個(gè)贊
很明顯ThreadB先wait,但代碼卻ThreadA先調(diào)用.... 只要讓ThreadB先執(zhí)行就可以了
ThreadB threadB = new ThreadB();
threadB.start();
Thread.sleep(10);
ThreadA threadA = new ThreadA();
threadA.start();
注意:兩個(gè)Thread同時(shí)執(zhí)行,java并不能能保證先調(diào)用的Thread先執(zhí)行。
添加回答
舉報(bào)