[問答題] 本題程序中實(shí)現(xiàn)了一個“生產(chǎn)者一消費(fèi)者問題”。生產(chǎn)者產(chǎn)生一個隨機(jī)數(shù)存入DataPool類中,消費(fèi)者從中取出數(shù)據(jù)。DataPool類一次只能存放一個數(shù)據(jù)
[問答題] 本題程序中實(shí)現(xiàn)了一個“生產(chǎn)者一消費(fèi)者問題”。生產(chǎn)者產(chǎn)生一個隨機(jī)數(shù)存入DataPool類中,消費(fèi)者從中取出數(shù)據(jù)。DataPool類一次只能存放一個數(shù)據(jù)。請更正題中帶下劃線的部分。
注意:不改變程序的結(jié)構(gòu),不得增行或刪行。
class DataPool
private int data;
private boolean isFull;
public DataPool()
isFull=false;public synchronized void putData(int d) if(isFull= =true)
try
this.notify();
catch(InterruptedException e)
data=d;
isFull=true;
System.out.println("生產(chǎn)了一個數(shù)據(jù):"+data);
this.notify();
public synchronized int getData() if(isFull= =false)
try
this.wait();
catch(InterruptedException e)
isFull=false;
System.out.println("消費(fèi)了一個數(shù)據(jù)"+data);
th
正確答案:this.wait() this.notify() thread.sleep((int)(Math.random()*1000))
參考解析:[講解] 本題考查知識點(diǎn):多線程同步與互斥、線程的概念和實(shí)現(xiàn)方法。解題思路:Data Pool是一個用來存放數(shù)據(jù)的緩沖池,其中可以存放一個血型數(shù)據(jù),變量isFull作為標(biāo)志量,標(biāo)志該緩沖池中是否有數(shù)據(jù)。Put Data()方法負(fù)責(zé)向Data Pool中存放數(shù)據(jù),本方法調(diào)用成功,緩沖池中就存入了數(shù)據(jù),getData()方法負(fù)責(zé)從DataPool中獲得數(shù)據(jù),本方法調(diào)用成功,緩沖池就為空。Producer類負(fù)責(zé)產(chǎn)生隨機(jī)數(shù)據(jù),然后將數(shù)據(jù)存放到DataPool中。Consumer類負(fù)責(zé)才能夠從DataPool中取出數(shù)據(jù)。Producer和Consumer共享同一個Data Pool對象。當(dāng)某個線程進(jìn)入synchronized塊后,共享的數(shù)據(jù)并不一定能滿足該線程的需要,這樣線程就需要等待其他線程修改共享數(shù)據(jù),直到滿足需要以后才繼續(xù)執(zhí)行,但是當(dāng)前線程必須釋放鎖以使得其他線程可以運(yùn)行。wait()和notify()方法是實(shí)現(xiàn)線程之間通信的兩個方法。wait()用來釋放線程擁有的鎖,使線程進(jìn)入等待隊(duì)列;notify()用來喚醒等待隊(duì)列中的線程,并把它加入到申請鎖的隊(duì)列。本題中生產(chǎn)者在DataPool有數(shù)據(jù)的情況下需要進(jìn)入等待消費(fèi)者取出數(shù)據(jù),所以需要調(diào)用wait()方法,因此第1個下劃線的地方應(yīng)該改為this.wait()。消費(fèi)者線程在取出數(shù)據(jù)以后,必須通知生產(chǎn)者線程DataPool中已經(jīng)沒有數(shù)據(jù)了,因此第2個下劃線的地方改為this.notify()。第3個下劃線的地方,考查常用的線程類的使用。Runnable接口的目的是使任何類都可以為線程提供線程體,但它本身并不是線程,所以并不能直接調(diào)用Thread類的方法,需要改為 thread.sleep。
詞條內(nèi)容僅供參考,如果您需要解決具體問題
(尤其在法律、醫(yī)學(xué)等領(lǐng)域),建議您咨詢相關(guān)領(lǐng)域?qū)I(yè)人士。