版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第九章習題及答案思考與練習并發(fā)編程基本概念代碼9-1這個程序啟動了幾個線程?回想以前編寫的程序啟動了幾個線程?答:啟動了主線程(程序入口)、t1線程。以前編寫的程序,除了GUI程序,大部分只啟動一個線程。代碼9-1主線程什么時候結束執(zhí)行?主線程結束了,整個程序就一定會結束嗎?答:執(zhí)行完12行后就結束。主線程結束,如果程序中還有其他線程運行,整個程序就未結束。如果注釋掉代碼第10行,程序運行結果是什么?答:t1線程并未啟動。如果在FirstThread.java的run()方法中調用Thread.currentThread().getName()方法,得到的名字是什么?答:線程1.任務與線程思考與練習1:改寫代碼9-1,將第10行的t1.start()改成t1.run(),觀察運行結果。有何不同?嘗試分析原因。答:未啟動t1線程。但會在主線程中運行一遍run方法,運行完后,才會運行主線程接下來的語句。main線程執(zhí)行完,是不是整個程序就執(zhí)行完了?答:主線程結束,如果程序中還有其他線程運行,整個程序就未結束。當執(zhí)行完一個線程的start()方法,該線程是不是就被操作系統(tǒng)調度并占用了CPU?答:不一定。當執(zhí)行完一個線程的start()方法,該線程并不會立即被操作系統(tǒng)調度并占用CPU。操作系統(tǒng)會在適當的時機調度該線程,并分配CPU時間給它。調用start()方法后,線程只是從NEW狀態(tài)進入RUNNABLE狀態(tài)。思考與練習2:修改代碼9-4,刪除t1.join()與t2.join()再觀察運行結果?分析運行結果。答:有可能輸出“-----比賽結束-----”后,t1、t2還在運行。嘗試修改代碼9-6中第19行,將true改為false。然后觀察程序輸出結果。回答為什么?答:如果設置為false,那么t1就不是守護線程。而t1的run方法中是一個無限循環(huán),那么即使主線程結束后,t1還會持續(xù)運行,不會終止運行。。同步將代碼9-7中的Counter替換為9.3.2節(jié)中的同步代碼塊SyncCounter,并對里面的substractId()方法使用同步方法來改寫,使得代碼9-7最終可得到正確結果0。答:改寫后的代碼classSyncCounter{ privatestaticintid=0; publicstaticvoidaddId(){ synchronized(SyncCounter.class){ id++; } } publicstaticsynchronizedvoidsubtractId(){ id--; } publicstaticintgetId(){ returnid; }}比較同步代碼塊與同步方法的異同。答:相同點:都可以用來實現線程同步,避免多個線程同時訪問共享資源導致的數據不一致性。不同點:同步代碼塊:可以指定鎖定的對象,只有一個線程可以進入同步代碼塊。靈活性更高,可以指定不同的鎖對象。同步方法:鎖定的是整個方法,只能有一個線程執(zhí)行該方法。簡單易用,適合對整個方法進行同步控制。線程通信:wait與notify方法改寫ProducerConsumerV1為ProducerConsumerV2,在Repository類中使用while方式(循環(huán)檢測法)來判定倉庫容量從而實現正確的同步訪問。答:classRepository{//存放字符串的倉庫privateintcapacity=10;//倉庫容量默認為10privateList<String>repo=newLinkedList<>();publicsynchronizedvoidadd(Stringt)throwsInterruptedException{while(repo.size()>=capacity){wait();}repo.add(t);notifyAll();//倉庫中已有貨,喚醒其他線程}publicsynchronizedStringremove()throwsInterruptedException{while(repo.size()<=0){wait();}Stringx=repo.remove(0);notifyAll();//從倉庫中取出貨物,喚醒其他線程returnx;}publicsynchronizedintsize(){returnrepo.size();}}是否還有其它的方法可以解決生產者和消費者問題?答:使用阻塞隊列(BlockingQueue):java.util.concurrent包提供了阻塞隊列(如ArrayBlockingQueue,LinkedBlockingQueue等)。使用信號量:Semaphore使用Lock與Condition:java.util.concurrent.locks。判斷題(T)一個Java程序啟動時,就會產生一個進程,該進程中會默認創(chuàng)建一個線程,在這個線程上會運行main()方法中的代碼。(F)調用Thread類的run()方法后,新創(chuàng)建的線程就會啟動。(F)在Java中,高優(yōu)先級的可運行線程會搶占低優(yōu)先級線程。(T)實現Runnable接口比繼承Thread類創(chuàng)建線程的方式擴展性更好。(T)同步代碼塊中的鎖對象可以是任意類型的對象。選擇題(多選題)以下說法正確的是:ABDA. Java程序啟動后,就啟動了一個JVM進程B. 進程是運行中的程序C. 可以不用啟動進程,直接啟動線程D. 一個程序可以啟動多個線程,最少也要啟動一個線程(單選題)以下代碼空白部份填入()可以通過編譯:DThreadthread=newThread(new________(){publicvoidrun(){...}});A. ComparableB. ComparatorC. ThreadD. Runnable(多選題)以下正確說法的是?BCA. 實現Runnable接口并調用其start()方法,就可以啟動線程B. Runnable接口是用來創(chuàng)建任務的C. 可以通過繼承Thread類來創(chuàng)建線程D. 可以調用Thread的run()方法來啟動線程(單選題)以下正確說法的是?BA. 調用線程的start()方法,該線程就可以馬上獲取CPU運行B. 調用其他線程的join()方法可讓當前線程等待其他線程運行完C. Thread.sleep(400)意味著當前線程在400ms后就會結束休眠然后馬上運行D. yield()方法能保證當前線程一定會讓出CPU(單選題)為了確保add()在多線程存取下的線程安全,應該加上()關鍵字:Bpublic____________voidadd(Objecto){if(next==list.length){list=Arrays.copyOf(list,list.length*2);}list[next++]=o;}A. abstractB. synchronizedC. staticD. volatile(多選題)以下正確說法的是?ABCA. 產生線程沖突的根本原因,是因為多個線程對共享資源不加限制地訪問B. 解決線程沖突可以使用互斥訪問C. 可以使用對象內部鎖實現互斥訪問D. 執(zhí)行synchronized方法,線程進入Runnable狀態(tài)(多選題)關于生產者、消費者問題以下正確說法的是?ACA. 生產者、消費者問題是一個多線程協(xié)作問題B. 只使用wait/notify就可以解決線程協(xié)作問題C. 結合使用synchronized、wait、notify可以解決部分同步問題D. A線程使用wait()方法等待,B線程使用notify()方法。那么A線程會被馬上喚醒,并被執(zhí)行。E. 使用synchronized、wait、notify方法是解決同步問題的唯一方法編程題編寫類實現Runnable接口循環(huán)輸出10次“線程名:HelloWorld”,其中線程名為當前線程的名字,每次隨機休眠1-3秒。在main方法啟動5個線程運行,然后在最后一行輸出“線程名:結束”,觀察結果。答:classHelloWorldRunnableimplementsRunnable{privatestaticfinalRandomrandom=newRandom();@Overridepublicvoidrun(){for(inti=0;i<10;i++){try{//隨機休眠1-3秒Thread.sleep((random.nextInt(3)+1)*1000);}catch(InterruptedExceptione){Thread.currentThread().interrupt();System.out.println("Threadwasinterrupted,Failedtocompleteoperation");}System.out.println(Thread.currentThread().getName()+":HelloWorld");}}}//測試publicstaticvoidmain(String[]args){for(inti=0;i<5;i++){Threadthread=newThread(newHelloWorldRunnable(),"線程"+(i+1));thread.start();}System.out.println(Thread.currentThread().getName()+":結束");}創(chuàng)建兩個線程,一個線程輸出100個1~26,另一個線程輸出100個A~Z。觀察運行結果。注意:一個線程使用繼承Thread類的寫法,另一個線程使用實現Runnable接口的寫法。答://繼承Thread類的線程classNumberThreadextendsThread{publicvoidrun(){for(inti=0;i<100;i++){System.out.println((i%26)+1);try{Thread.sleep(50);//稍微延遲以便觀察輸出}catch(InterruptedExceptione){e.printStackTrace();}}}}//實現Runnable接口的線程classLetterRunnableimplementsRunnable{publicvoidrun(){for(inti=0;i<100;i++){System.out.println((char)('A'+(i%26)));try{Thread.sleep(50);//稍微延遲以便觀察輸出}catch(InterruptedExceptione){e.printStackTrace();}}}}//測試publicstaticvoidmain(String[]args){//創(chuàng)建并啟動繼承Thread的線程newNumberThread().start();//創(chuàng)建并啟動實現Runnable的線程newThread(newLetterRunnable()).start();}實現兩個線程交替打印字母A和字母B,要求線程A先打印字母A,然后線程B打印字母B,再由線程A打印字母A,依次循環(huán)打印。提示:可使用synchronized結合wait和notify來實現線程協(xié)作與同步。答:publicclassAlternatingPrint{privatefinalObjectlock=newObject();privatebooleanturnA=true;//控制輪到哪個線程打印publicstaticvoidmain(String[]args){AlternatingPrintap=newAlternatingPrint();ThreadthreadA=newThread(()->ap.printA());ThreadthreadB=newThread(()->ap.printB());threadA.start();threadB.start();}publicvoidprintA(){for(inti=0;i<10;i++){synchronized(lock){while(!turnA){try{lock.wait();}catch(InterruptedExceptione){Thread.currentThread().interrupt();}}System.out.print("A");turnA=false;lock.notify();}}}publicvoidprintB(){for(inti=0;i<10;i++){synchronized(lock){while(turnA){try{lock.wait();}catch(InterruptedExceptione){Thread.currentThread().interrupt();}}System.out.print("B");turnA=true;lock.notify();}}}}分別創(chuàng)建2個子線程student和teacher,主線程宣布開始上課后,student說“我要睡覺......”后準備睡眠1小時。teacher輸出“準備上課......”后停頓3秒,發(fā)現學生在睡覺。于是吵醒休眠的學生student,student被吵醒后只能說“好吧,我準備上課......”。teacher上課5秒后結束課程。teacher結束課程后主線程宣布下課。答:publicclassClassSession{publicstaticvoidmain(String[]args){finalObjectclassLock=newObject();Threadstudent=newThread(()->{synchronized(classLock){System.out.println("Student:我要睡覺......");try{//學生準備睡眠1小時,這里用1秒代替1小時以便觀察classLock.wait(3600*1000);}catch(InterruptedExceptione){System.out.println("Student:好吧,我準備上課......");}}});Threadteacher=newThread(()->{synchronized(classLock){System.out.println("Teacher:準備上課......");try{//教師停頓3秒Thread.sleep(3000);}catch(InterruptedExceptione){e.printStackTrace();}System.out.println("Teacher:發(fā)現學生在睡覺,需要吵醒學生。");classLock.notify();//吵醒學生try{//教師上課5秒Thread.sleep(5000);}catch(InterruptedExceptione){e.printStackTrace();}System.out.println("Teacher:課程結束。");}});System.out.println("主線程:開始上課!");student.start();teacher.start();try{teacher.join();//等待教師線程結束}catch(InterruptedExceptione){e.printStackTrace();}System.out.println("主線程:下課!");}}進階:假設有兩個線程,一個線程負責讀取文件內容,另一個線程負責將讀取到的文件內容寫入到另一個文件中。嘗試使用PipedInputStream和PipedOutputStream實現兩個線程之間的數據傳輸。答:以下代碼無需編寫額外的同步代碼就可實現同步,這是因為在使用PipedInputStream和PipedOutputStream的場景中,同步主要是通過管道本身的內部機制來實現的。這兩個類是為線程間的數據傳輸而設計的,它們內部包含了必要的同步控制,以確保數據的一致性和線程安全。importjava.io.*;publicclassFileTransfer{publicstaticvoidmain(String[]args){try(PipedOutputStreamoutput=newPipedOutputStream();PipedInputStreaminput=newPipedInputStream(output)){ThreadreaderThread=newThread(()->{try(FileInputStreamfileInputStream=newFileInputStream("source.txt")){byte[]buffer=newbyte[1024];intbytesRead;while((bytesRead=fileInputStream.read(buffer))!=-1){
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023年7月國開電大行管??啤渡鐣{查研究與方法》期末紙質考試試題及答案
- 辦公軟件技能大賽筆試試題及答案
- 危重孕產婦救治試題及答案
- 中暑急救知識試題及答案
- 會計從業(yè)資格考試會計基礎試題及答案
- 護士三基靜脈輸液和輸血試題附答案
- 醫(yī)師考試考試試題及答案
- 中醫(yī)基礎理論知識試題庫(含答案)
- 2025年中學生古詩詞知識競賽題庫及答案
- 三種人考試練習試題含答案
- 高校區(qū)域技術轉移轉化中心(福建)光電顯示、海洋氫能分中心主任招聘2人備考題庫及答案詳解(考點梳理)
- 航空安保審計培訓課件
- 2026四川成都錦江投資發(fā)展集團有限責任公司招聘18人備考題庫有答案詳解
- 高層建筑滅火器配置專項施工方案
- 2023-2024學年廣東深圳紅嶺中學高二(上)學段一數學試題含答案
- 2025年全國職業(yè)院校技能大賽中職組(母嬰照護賽項)考試題庫(含答案)
- 2026元旦主題班會:馬年猜猜樂馬年成語教學課件
- 架桿租賃合同
- 哈工大歷年電機學試卷及答案詳解
- GB/T 16886.1-2022醫(yī)療器械生物學評價第1部分:風險管理過程中的評價與試驗
- YS/T 1109-2016有機硅用硅粉
評論
0/150
提交評論