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)者線程將被阻塞。當隊列中沒有項目時,使用者線程將被阻止。

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);
}
});
對消費者進行相同的修改。
添加回答
舉報