第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Java wait() notify()循環(huán)打印A和B

Java wait() notify()循環(huán)打印A和B

SMILET 2019-03-28 19:15:42
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();                }            }        }    }}運(yùn)行以上代碼,為什么會(huì)一直不結(jié)束無限wait下去?
查看完整描述

5 回答

?
慕碼人2483693

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();

                /*}*/

            }

        }

    }

}


查看完整回答
反對 回復(fù) 2019-04-16
?
吃雞游戲

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

這個(gè)和生產(chǎn)者消費(fèi)者的問題很像。你題目中無限wait下去唯一的情況是:當(dāng)ThreadAThreadB有一方已執(zhí)行完,未執(zhí)行完的線程wait之后,另一線程并不能喚醒它,因?yàn)槟莻€(gè)線程已跑完了。


查看完整回答
反對 回復(fù) 2019-04-16
?
慕俠2389804

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

A線程先跑,如果B還沒有wait的時(shí)候,A已經(jīng)notify了,這時(shí)這個(gè)notify就沒有效果,等B開始wait了,A的notify已經(jīng)跑完了,根本永遠(yuǎn)得不到通知,你這么寫邏輯是有問題的


查看完整回答
反對 回復(fù) 2019-04-16
?
慕村9548890

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í)行。


查看完整回答
反對 回復(fù) 2019-04-16
  • 5 回答
  • 0 關(guān)注
  • 785 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號