Java程序設(shè)計項目式教程(含實訓(xùn)任務(wù)單)習(xí)題答案 單元6 課后作業(yè)及參考答案_第1頁
Java程序設(shè)計項目式教程(含實訓(xùn)任務(wù)單)習(xí)題答案 單元6 課后作業(yè)及參考答案_第2頁
Java程序設(shè)計項目式教程(含實訓(xùn)任務(wù)單)習(xí)題答案 單元6 課后作業(yè)及參考答案_第3頁
Java程序設(shè)計項目式教程(含實訓(xùn)任務(wù)單)習(xí)題答案 單元6 課后作業(yè)及參考答案_第4頁
Java程序設(shè)計項目式教程(含實訓(xùn)任務(wù)單)習(xí)題答案 單元6 課后作業(yè)及參考答案_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

課后作業(yè)一、填空題1.Runnable2.新生狀態(tài)、就緒狀態(tài)、阻塞狀態(tài)、就緒狀態(tài)3.OK4.D5.B6.B二、簡答題1.什么是多線程?多線程與多進(jìn)程的區(qū)別是什么?參考答案:多線程是指在一個程序中同時執(zhí)行多個任務(wù)的能力。這些任務(wù)在獨立的執(zhí)行流中運行,并且可以并發(fā)地執(zhí)行。多進(jìn)程是指運行多個程序?qū)嵗噙M(jìn)程能夠充分利用操作系統(tǒng)的多任務(wù)管理器,確保每個工作進(jìn)程始終處于最大工作效率狀態(tài)。而多線程是運行在同一個進(jìn)程中,同一進(jìn)程中的所有線程可以訪問相同的全局變量和系統(tǒng)資源。怎樣解決線程的并發(fā)訪問問題?參考答案:①通過線程同步解決:使用synchronized關(guān)鍵字限制多個線程同時訪問共享資源的權(quán)限,避免多個線程同時修改同一份數(shù)據(jù)而導(dǎo)致數(shù)據(jù)不一致的問題。②通過線程通信解決:使用wait()和notify()方法來協(xié)調(diào)多個線程之間的操作。這可以確保在特定條件下,只有一個線程能夠訪問共享資源,從而避免數(shù)據(jù)競爭和死鎖等問題。線程有哪些狀態(tài)?它們之間是如何進(jìn)行轉(zhuǎn)換的?參考答案:線程的整個生命周期可以包含:新生狀態(tài)(New)、就緒狀態(tài)(Runnable)、運行狀態(tài)(Running)、被阻塞狀態(tài)(Blocked)、死亡狀態(tài)(Dead)下五個狀態(tài)。什么是死鎖?如何防止死鎖出現(xiàn)?參考答案:死鎖是指兩個或兩個以上的線程在執(zhí)行過程中,由于競爭資源或者由于彼此通信而造成的一種阻塞的現(xiàn)象,若無外力作用,它們都將無法推進(jìn)下去。當(dāng)下面四個條件同時滿足時,就會發(fā)生死鎖。1)互斥使用,即當(dāng)資源被一個線程使用(占有)時,別的線程不能使用。2)不可搶占,資源請求者不能強(qiáng)制從資源占有者手中奪取資源,資源只能由資源占用者主動釋放。3)請求和保持,即當(dāng)資源的請求者在請求其他的資源的同時保持對原有資源的占有。4)循環(huán)等待,即存在一個等待隊列:P1占有P2的資源,P2占有P3的資源,P3占有P1的資源。這樣就形成了一個等待環(huán)路。防止死鎖的途徑就是不能讓滿足死鎖的條件同時發(fā)生。三、編程題1.建立兩個Thread的子類,一個在run()方法中調(diào)用wait(),另一個在run()方法休眠幾秒后對第一個線程調(diào)用notifyAll(),使第一個線程能輸出一條信息。參考代碼:publicclassTest{publicstaticvoidmain(String[]args){Objectlock=newObject();WaitThreadwaitThread=newWaitThread("WaitThread",lock);NotifyThreadnotifyThread=newNotifyThread("NotifyThread",lock);waitThread.start();notifyThread.start();}}publicclassNotifyThreadextendsThread{privateObjectlock;publicNotifyThread(Stringname,Objectlock){super(name);this.lock=lock;}@Overridepublicvoidrun(){try{Thread.sleep(3000);//休眠3秒synchronized(lock){lock.notifyAll();}}catch(InterruptedExceptione){e.printStackTrace();}}}publicclassWaitThreadextendsThread{privateObjectlock;publicWaitThread(Stringname,Objectlock){super(name);this.lock=lock;}@Overridepublicvoidrun(){try{synchronized(lock){lock.wait();System.out.println(Thread.currentThread().getName()+"接收到通知,結(jié)束");}}catch(InterruptedExceptione){e.printStackTrace();}}}修改任務(wù)6.2的需求,加入多個服務(wù)員,并能夠指明是誰得到了某個食物。注意在這個例子中必須使用notifyAll()方法,而不是notify()方法。參考代碼:publicclassRestaurant{ publicFoodfood;//聲明食物類 publicstaticvoidmain(String[]args){ Restaurantrestaurant=newRestaurant(); WaitPersonwaitPerson=newWaitPerson(restaurant,"服務(wù)員1"); WaitPersonwaitPerson2=newWaitPerson(restaurant,"服務(wù)員2"); Chefchef=newChef(restaurant); }}classFood{ privatestaticinti=0;//i用于生成累計計數(shù) privateintcount=++i;//count計數(shù) publicFood(){ if(count>6){//超出6份,則無法再繼續(xù) System.out.println("Outoffood,closing!"); System.exit(0); } } publicStringtoString(){ return"food"+count; }}classWaitPersonextendsThread{ privateRestaurantrestaurant; publicWaitPerson(Restaurantr,Stringname){ super(name); restaurant=r; start();//啟動線程 } publicvoidrun(){ while(true){ while(restaurant.food==null){//如果廚師沒有準(zhǔn)備好食物 synchronized(restaurant){//進(jìn)入等待模式,直到被Chef的notify()方法喚醒 try{ restaurant.wait(); }catch(InterruptedExceptione){ e.printStackTrace(); } System.out.println(this.getName()+"Waitpersongot"+restaurant.food);//拿到廚師準(zhǔn)備好的食物 restaurant.food=null;//等待廚師準(zhǔn)備下個食物 } } } }}classChefextendsThread{ privateRestaurantrestaurant; privateWaitPersonwaitPerson; publicChef(Restaurantr){ restaurant=r; start();//啟動線程 } publicvoidrun(){ while(true){ if(restaurant.food==null){//如果服務(wù)員需要食物 restaurant.food=newFood();//制作新食物 System.out.println("foodup!"); synchronized(restaurant){ restaurant.notifyAll();//喚醒服務(wù)員可以取食物 } } try{ sleep(1000); }catch(InterruptedExceptione){ e.printStackTrace(); } } }}使用繼承Thread類的方法實現(xiàn)一個多線程程序,該程序先后啟動三個線程。每個線程首先輸出一條創(chuàng)建信息,然后休眠一段時間,最后打印出結(jié)束信息并退出。publicclassTest{publicstaticvoidmain(String[]args){MyThreadthread1=newMyThread("Thread-1",1000);MyThreadthread2=newMyThread("Thread-2",2000);MyThreadthread3=newMyThread("Thread-3",3000);thread1.start();thread2.start();thread3.start();}}publicclassMyThreadextendsThread{privateStringthreadName;privateintsleepTime;publicMyThread(Stringname,intsleepTime){threadName=name;this.sleepTime=sleepTime;}@Overridepublicvoidrun(){System.out.println(threadName+"開始創(chuàng)建...");try{Thread.sleep(sleepTime);System.out.println(threadName+"創(chuàng)建完畢,準(zhǔn)備休眠...");Thread.sleep(sleepTime);System.out.println(threadName+"休眠結(jié)束,準(zhǔn)備退出...");}catch(InterruptedExceptione){e.printStackTrace();}}}4.用實現(xiàn)Runnable接口的方法實現(xiàn)上面的題目。參考代碼:publicclassTest{publicstaticvoidmain(String[]args){Threadthread1=newThread(newMyRunnable("Thread-1",1000));Threadthread2=newThread(newMyRunnable("Thread-2",2000));Threadthread3=newThread(newMyRunnable("Thread-3",3000));thread1.start();thread2.start();thread3.start();}}packagechapter6_4;publicclassMyRunnableimplementsRunnable{privateStringthreadName;privateintsleepTime;publicMyRunnable(Stringname,intsleepTime){threadName=name;this.sleepTime=sleepTime;}@Overridepublicvoidrun(){System.out.println(threadName+"開始創(chuàng)建...");try{

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論