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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么使用者線程僅在生產(chǎn)者完成寫入 10 個對象時才執(zhí)行

為什么使用者線程僅在生產(chǎn)者完成寫入 10 個對象時才執(zhí)行

繁星coding 2022-09-07 21:33:27
我無法理解為什么消費者線程僅在生產(chǎn)者完成編寫10個對象時才執(zhí)行。如果我根據(jù)javadoc看到它,只有當同步塊完成時才會執(zhí)行線程,我不認為在下面的情況下,塊是完整的,因為執(zhí)行在同步塊內(nèi)部循環(huán)進行。根據(jù) java doc notify 方法注釋喚醒的線程將無法繼續(xù),直到當前線程放棄此對象上的鎖定。        Runnable consumer = (() -> {            synchronized (BUFFER) {                while(true) {                try {                        while(BUFFER.isEmpty()) {                            BUFFER.wait();                        }                        System.out.println("consuming "+BUFFER.poll());                        System.out.println("size "+BUFFER.size());                        TimeUnit.SECONDS.sleep(1);                        BUFFER.notify();                    } catch (InterruptedException e) {                    }                }            }});        Runnable producer = (() -> {            synchronized (BUFFER) {                while(true) {                try {                    while(BUFFER.size() == 10) {                        BUFFER.wait();                    }                    Random random = new Random();                    System.out.println("producing "+BUFFER.offer(random.nextInt()));                    TimeUnit.SECONDS.sleep(1);                    BUFFER.notify();                } catch (Exception e) {                }                }        }        });        executor.submit(consumer);        executor.submit(producer);OUTPUTproducing trueproducing trueproducing trueproducing trueproducing trueproducing trueproducing trueproducing trueproducing trueproducing trueconsuming 1494680650size 9consuming 2055368049size 8[comment]: SUCCESS: Assembly.Load(ProcMonInject, Version=2.7.5159.0, Culture=neutral, PublicKeyToken=d34a061f079be347)consuming 569414348size 7consuming -1146378118size 6consuming -2025680888size 5consuming -1624438827size 4consuming -2035450589size 3consuming 953341046size 2consuming 776364558size 1consuming -2019340509size 0producing true
查看完整描述

2 回答

?
慕仙森

TA貢獻1827條經(jīng)驗 獲得超8個贊

當您從生產(chǎn)者線程調(diào)用BUFFER.notify()時,使用者線程將被喚醒,并將嘗試獲取Buffer對象上的鎖定。但是生產(chǎn)者線程仍然有緩沖區(qū)對象的鎖(所以消費者必須等待它被釋放)。當生產(chǎn)者滿足條件時,它將釋放緩沖區(qū)對象上的鎖。這一次,使用者將獲取鎖并消耗緩沖區(qū)。直到它滿足條件并釋放鎖。while(BUFFER.size() == 10)while(BUFFER.isEmpty())

僅供參考;使用 LinkedBlockingQueue 類,可以在不使用鎖的情況下編寫生產(chǎn)者-消費者(如果為隊列提供容量,則當容量已滿時,生產(chǎn)者線程將被阻塞。當隊列中沒有項目時,使用者線程將被阻止。


查看完整回答
反對 回復(fù) 2022-09-07
?
一只斗牛犬

TA貢獻1784條經(jīng)驗 獲得超2個贊

創(chuàng)建器在同步塊內(nèi)處于休眠狀態(tài)。


請嘗試以下操作:


 Runnable producer = (() -> {

            while(true) {

                synchronized (BUFFER) {

                    try {

                        while(BUFFER.size() == 10) {

                            BUFFER.wait();

                        }

                        Random random = new Random();

                        System.out.println("producing "+BUFFER.offer(random.nextInt()));

                        BUFFER.notify();

                    } catch (Exception e) {

                    }

                }

                TimeUnit.SECONDS.sleep(1);

        }

        });

對消費者進行相同的修改。


查看完整回答
反對 回復(fù) 2022-09-07
  • 2 回答
  • 0 關(guān)注
  • 238 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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