(完整word版)Java語言程序設(shè)計(鄭莉)第八章課后習(xí)題答案_第1頁
(完整word版)Java語言程序設(shè)計(鄭莉)第八章課后習(xí)題答案_第2頁
(完整word版)Java語言程序設(shè)計(鄭莉)第八章課后習(xí)題答案_第3頁
(完整word版)Java語言程序設(shè)計(鄭莉)第八章課后習(xí)題答案_第4頁
(完整word版)Java語言程序設(shè)計(鄭莉)第八章課后習(xí)題答案_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Java語言程序設(shè)計第八章課后習(xí)題答案1.進程和線程有何區(qū)別,Java是如何實現(xiàn)多線程的。答:區(qū)別:一個程序至少有一個進程,一個進程至少有一個線程;線程的劃分尺度小于進程;進程在執(zhí)行過程中擁有獨立的內(nèi)存單元,而多個線程共享內(nèi)存,從而極大地提高了程序的運行效率。Java程序一般是繼承Thread類或者實現(xiàn)Runnable接口,從而實現(xiàn)多線程。2.簡述線程的生命周期,重點注意線程阻塞的幾種情況,以及如何重回就緒狀態(tài)。答:線程的聲明周期:新建-就緒-(阻塞)-運行--死亡線程阻塞的情況:休眠、進入對象wait池等待、進入對象lock池等待;休眠時間到回到就緒狀態(tài);在wait池中獲得notify()進入lock池,然后獲得鎖棋標進入就緒狀態(tài)。3.隨便選擇兩個城市作為預(yù)選旅游目標。實現(xiàn)兩個獨立的線程分別顯示10次城市名,每次顯示后休眠一段隨機時間(1000毫秒以內(nèi)),哪個先顯示完畢,就決定去哪個城市。分別用Runnable接口和Thread類實現(xiàn)。(注:兩個類,相同一個測試類)//Runnable接口實現(xiàn)的線程runable類publicclassrunnableimplementsRunnable{privateStringcity;publicrunnable(){}publicrunnable(Stringcity){this.city=city;}publicvoidrun(){for(inti=0;i<10;i++){System.out.println(city);try{//休眠1000毫秒。Thread.sleep(1000);}catch(InterruptedExceptione){e.printStackTrace();}}}}//Thread類實現(xiàn)的線程thread類publicclassrunnableextendsThread{privateStringcity;publicrunnable(){}publicrunnable(Stringcity){this.city=city;}publicvoidrun(){for(inti=0;i<10;i++){System.out.println(city);try{//休眠1000毫秒。Thread.sleep(1000);}catch(InterruptedExceptione){e.printStackTrace();}}}}//test8_3publicclasstest8_3{publicstaticvoidmain(String[]args){//將創(chuàng)建一個線程對象,這個對象接受一個實現(xiàn)了Runnable接口。實際上這里也就是使用run()方法runnabler1=newrunnable("廣州");runnabler2=newrunnable("烏魯木齊");Threadt1=newThread(r1);Threadt2=newThread(r2);//啟動線程t1.start();t2.start();}}運行結(jié)果分別為:4.編寫一個多線程程序?qū)崿F(xiàn)如下功能:線程A和線程B分別在屏幕上顯示信息“…start”后,調(diào)用wait等待;線程C開始后調(diào)用sleep休眠一段時間,然后調(diào)用notifyall,使線程A和線程B繼續(xù)運行。線程A和線程B恢復(fù)運行后輸出信息“…end”后結(jié)束,線程C在判斷線程B和線程A結(jié)束后自己結(jié)束運行。//test8_4publicclasstest8_4{ThreadA=newThread("A"){publicvoidrun(){Wait("A");}};ThreadB=newThread("B"){publicvoidrun(){Wait("B");}};ThreadC=newThread("C"){publicvoidrun(){while(true){if(!A.isAlive()&&!B.isAlive())return;try{Thread.sleep(2000);}catch(InterruptedExceptione){e.printStackTrace();}notifyall();}}};publicsynchronizedvoidWait(Stringname){System.out.println(name+"..start");try{wait();}catch(InterruptedExceptione){e.printStackTrace();}System.out.println(name+"..end");}publicsynchronizedvoidnotifyall(){notifyAll();}publicstaticvoidmain(Stringargs[]){test8_4test=newtest8_4();//A、B兩線程一起輸入start和輸出end,不過中間有C讓線程休眠2秒,沒法全部一次性輸出,//之后再喚醒,讓AB繼續(xù)輸出下半部分endtest.A.start();test.B.start();test.C.start();}}運行結(jié)果:5.實現(xiàn)一個數(shù)據(jù)單元,包括學(xué)號和姓名兩部分。編寫兩個線程,一個線程往數(shù)據(jù)單元中寫,另一個線程往外讀。要求沒寫一次就往外讀一次。//Data類importjava.util.Scanner;publicclassData{StringstudentId;Stringname;booleanavailable=false;//判斷是讀是寫Scannerin=newScanner(System.in);//定義一個輸入對象publicsynchronizedvoidread(){if(available)try{wait();}catch(Exceptione){}System.out.printf("請輸入學(xué)號:");try{studentId=in.next();}catch(Exceptione){System.out.println("輸入學(xué)號出錯!");}System.out.printf("請輸入姓名:");try{name=in.next();}catch(Exceptione){System.out.println("輸入姓名出錯!");}System.out.println();available=true;notify();}publicsynchronizedvoidwrite(){if(!available)try{wait();}catch(Exceptione){}System.out.println("輸出學(xué)生學(xué)號:"+studentId+"姓名:"+name+"\n");available=false;notify();}}//Read類publicclassReadextendsThread{Datad1=null;publicRead(Datad){this.d1=d;}publicvoidrun(){while(true){d1.read();}}}//Write類classWriteextendsThread{Datad2=null;publicWrite(Datad){this.d2=d;}publicvoidrun(){while(true){d2.write();}}}//test8_5類publicclasstest8_5{publicstaticvoidmain(String[]args){Datadata=newData();newRead(data).start();newWrite(data).start();}}運行結(jié)果:6.創(chuàng)建兩個不同優(yōu)先級的線程,都從1數(shù)到10000,看看哪個數(shù)得快。(注:線程的優(yōu)先級別越高低與執(zhí)行速度沒有絕對關(guān)系!)//Count類publicclassCountextendsThread{intwhich;intn=10000;publicCount(intwhich){this.which=which;}publicvoidrun(){for(inti=1;i<=n;i++){if(i==n){System.out.println(which+"號進程"+"結(jié)束!");}}}}//test8_6publicclasstest8_6{publicstaticvoidmain(String[]args){Countcount1=newCount(1);Countcount2=newCount(2);Threadt1=newThread(count1);Threadt2=newThread(count2);t1.setPriority(2);//1號進程優(yōu)先級是2t2.setPriority(8);//2號進程優(yōu)先級是8t1.start();t2.start();}}運行結(jié)果:都有可能。7.編寫一個Java程序,以說明較高優(yōu)先級的線程通過調(diào)用sleep方法,使較低優(yōu)先級的線程獲得運行的機會。(這里可以借鑒課本例8—13)//TestThread類publicclassTestThreadextendsThread{privateinttick=1;privateintnum;publicTestThread(inti){this.num=i;}publicvoidrun(){while(tick<400000){tick++;if((tick%50000)==0){System.out.println("Thread#"+num+",tick="+tick);yield();try{sleep(1);}catch(Exceptione){}}}}}//test8_7publicclasstest8_7{publicstaticvoidmain(String[]args){TestThread[]runners=newTestThread[2];for(inti=0;i<2;i++){runners[i]=newTestThread(i);}runners[0].setPriority(2);runners[1].setPriority(5);for(inti=0;i<2;i++){runners[i].start();}}}運行結(jié)果:8.主線程控制新線程的生命,當主線程運行一段時間后,控制新線程死亡,主線程繼續(xù)運行一段時間后結(jié)束。(注:main函數(shù)就是主線程,程序里其他的Thread都屬于子線程??梢詤⒖颊n本的例8—1)//SonThread類publicclassSonThreadextendsThread{privateintnum;publicSonThread(intnum){this.num=num;}publicvoidrun(){inti=num;intresult=1;System.out.println("newthreadstart.");/*while(i>0){result=result*i;i--;}*/System.out.println("thenewthreadof"+num+"is"+result);System.out.println("newthreadends");}}//test8_8publicclasstest8_8{publicstaticvoidmain(String[]args){System.out.println("maintreadstart.");SonThreadnewThread=newSonThread(10);newThread.start();//;浪費時間的循環(huán)inti=1;while(i<=100000){i++;}newThread.stop();//結(jié)束新進程System.out.println("mainthreadends");}}運行結(jié)果:(這個結(jié)果很難把握,通常都會出現(xiàn)2那樣的結(jié)果,知道原理就好。)29.用兩個線程模擬存、取貨物。一個線程往一對象里放貨物(包括品名、價格),另外一個線程取貨物。分別模擬“放一個、取一個”和“放若干個、取若干個”兩種情況。//Good貨物類publicclassGood{Stringname;intprice;publicGood(){}publicGood(Stringname,intprice){=name;this.price=price;}publicGood(Goodg){=;this.price=g.price;}}//WareHouse倉庫類importjava.util.ArrayList;importjava.util.List;importjava.util.Scanner;publicclassWareHouse{Goodgood=null;Scannerin=newScanner(System.in);Listlist=newArrayList();//用來存放商品對象intcount;//想存入商品的個數(shù)booleanavailable=true;publicWareHouse(){}publicWareHouse(intcount){this.count=count;}publicWareHouse(Listlist){this.count=count;for(inti=0;i<list.size();i++){this.list.add((Good)list.get(i));}}publicsynchronizedvoidsaveGood(){if(available==false){try{wait();}catch(InterruptedExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}for(inti=0;i<count;i++){Stringn;intp;System.out.println("請輸入"+(i+1)+"號商品的名稱:");n=in.next();System.out.println("價格:");p=in.nextInt();good=newGood(n,p);list.add(good);}available=false;notify();}publicsynchronizedvoidtakeGood(){if(available==true){try{wait();}catch(InterruptedExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}for(inti=0;i<list.size();i++){good=(Good)list.get(i);System.out.print((i+1)+"號商品的名稱為:"+);System.out.println("\t價格為:"+good.price);}available=true;notify();}}//Save存貨物類publicclassSaveextendsThread{WareHousewareHouse=null;publicSave(WareHousew){this.wareHouse=w;}publicvoidrun(){wareHouse.saveGood();}}//Take取貨物類publicclassTakeextendsThread{WareHousewareHouse=null;publicTake(WareHousew){this.wareHouse=w;}publicvoidrun(){wareHouse.takeGood();}}//test8_9測試類importjava.util.Scanner;publicclasstest8_9{publicstaticvoidmain(String[]args){Scannerin=newScanner(System.in);System.out.println("請輸入倉庫的容量:");inti=in.nextInt();WareHousewareHouse=newWareHouse(i);ThreadsaveGood=newSave(wareHouse);ThreadtakeGood=newTake(wareHouse);saveGood.start();takeGood.start();}}運行結(jié)果:10.用兩個線程模擬對話,任何一個線程都可以隨時收發(fā)信息。(這道題本人搞不清楚,暫且用網(wǎng)上的給

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論