版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
學(xué)IT有疑問,就找千問千知千里尋他眾百度,鋒自苦寒磨礪出千鋒教育Java語言程序設(shè)計(第2版)教學(xué)設(shè)計課程名稱:Java語言程序設(shè)計(第2版)_______授課年級:___________________________授課學(xué)期:___________________________教師姓名:___________________________2020年03月01日課程名稱第11章多線程計劃學(xué)時4學(xué)時內(nèi)容分析本章主要介紹線程概述、線程的創(chuàng)建、線程的生命周期及狀態(tài)轉(zhuǎn)換、線程的調(diào)度、多線程同步、多線程通信、線程組和未處理的異常、線程池教學(xué)目標(biāo)與教學(xué)要求要求學(xué)生理解繼承的概念、掌握final關(guān)鍵字的使用、熟練掌握抽象類和接口的使用、理解多態(tài)的概念、掌握J(rèn)DK8中Lambda表達(dá)式的使用教學(xué)重點線程的創(chuàng)建、線程的生命周期及狀態(tài)轉(zhuǎn)換、線程的調(diào)度、多線程同步、多線程通信、線程組和未處理的異常、線程池教學(xué)難點線程的創(chuàng)建、線程的生命周期及狀態(tài)轉(zhuǎn)換、線程的調(diào)度、多線程同步、多線程通信、線程組和未處理的異常、線程池教學(xué)方式課堂講解及ppt演示教學(xué)過程第一課時(線程概述、線程的創(chuàng)建、線程的生命周期及狀態(tài)轉(zhuǎn)換、線程的調(diào)度)內(nèi)容回顧回顧上節(jié)內(nèi)容,引出本課時主題。上節(jié)已經(jīng)介紹了GUI(圖形用戶界面),前面章節(jié)講到的都是單線程編程,單線程的程序如同現(xiàn)在生活中只雇一名員工的工廠,這名員工必須做完一件事情后才可以做下一件事,多線程的程序則如同雇傭多名員工的工廠,他們可以同時分別做多件事情,Java語言提供了非常優(yōu)秀的多線程支持,程序可以通過非常簡單的方式來啟動多線程。本章將對多線程的相關(guān)知識進(jìn)行詳細(xì)講解。明確學(xué)習(xí)目標(biāo)能夠掌握進(jìn)程能夠掌握線程能夠掌握繼承Thread類創(chuàng)建線程能夠掌握實現(xiàn)Runnable接口創(chuàng)建線程能夠掌握使用Callable接口和Future接口創(chuàng)建線程能夠掌握三種實現(xiàn)多線程方式的對比分析能夠掌握線程的生命周期及狀態(tài)轉(zhuǎn)換能夠掌握線程的優(yōu)先級能夠掌握線程休眠能夠掌握線程讓步能夠掌握線程插隊能夠掌握后臺線程知識講解進(jìn)程進(jìn)程是程序的一次動態(tài)執(zhí)行過程,它需要經(jīng)歷從代碼加載、代碼執(zhí)行到執(zhí)行完畢的一個完整過程,這個過程也是進(jìn)程本身從產(chǎn)生、發(fā)展到最終消亡的過程。每個運行中的程序就是一個進(jìn)程,一般而言,進(jìn)程在系統(tǒng)中獨立存在,擁有自己獨立的資源,多個進(jìn)程可以在單個處理器上并發(fā)執(zhí)行且互不影響。例如,打開計算機(jī)中的殺毒軟件,可以在Windows任務(wù)管理器中查看該進(jìn)程,如圖所示。線程操作系統(tǒng)可以同時執(zhí)行多個任務(wù),任務(wù)就是線程,進(jìn)程可以同時執(zhí)行多個任務(wù),其中每個任務(wù)就是線程。例如,前面講解的殺毒軟件程序是一個進(jìn)程,那么它在為計算機(jī)體檢的同時可以清理垃圾文件,這就是兩個線程同時運行。在Windows任務(wù)管理器中也可以查看當(dāng)前系統(tǒng)的線程數(shù),如圖所示。繼承Thread類創(chuàng)建線程Java提供了Thread類代表線程,它位于java.lang包中,下面介紹Thread類創(chuàng)建并啟動多線程的步驟,具體步驟如下。(1)定義Thread類的子類,并重寫run()方法,run()方法稱為線程執(zhí)行體。(2)創(chuàng)建Thread子類的實例,即創(chuàng)建了線程對象。(3)調(diào)用線程對象的start()方法啟動線程。啟動一個新線程時,需要創(chuàng)建一個Thread類實例,接下來了解一下Thread類的常用構(gòu)造方法。如表所示。實現(xiàn)Runnable接口創(chuàng)建線程11.2.1節(jié)講解了繼承Thread類的方式創(chuàng)建線程,但Java只支持單繼承,一個類只能有一個父類,繼承Thread類后,就不能再繼承其他類,為了解決這個問題,可以用實現(xiàn)Runnable接口的方式創(chuàng)建線程,下面介紹實現(xiàn)Runnable接口創(chuàng)建并啟動多線程,具體步驟如下。(1)定義Runnable接口實現(xiàn)類,并重寫run()方法。(2)創(chuàng)建Runnable實現(xiàn)類的示例,并將實例對象傳給Thread類的target來創(chuàng)建線程對象。(3)調(diào)用線程對象的start()方法啟動線程。使用Callable接口和Future接口創(chuàng)建線程11.2.2節(jié)講解了實現(xiàn)Runnable接口的方式創(chuàng)建多線程,但重寫run()方法實現(xiàn)功能代碼有一定局限性,這樣做方法沒有返回值且不能拋出異常,JDK5.0后,Java提供了Callable接口來解決此問題,接口內(nèi)有一個call()方法可以作為線程執(zhí)行體,call()方法有返回值且可以拋出異常。下面介紹實現(xiàn)Callable接口創(chuàng)建并啟動線程,具體步驟如下。(1)定義Callable接口實現(xiàn)類,指定返回值類型,并重寫call()方法。(2)創(chuàng)建Callable實現(xiàn)類的實例,使用FutureTask類來包裝Callable對象,該FutureTask對象封裝了該Callable對象的call()方法的返回值。(3)使用FutureTask對象作為Thread對象的target創(chuàng)建并啟動新線程。(4)調(diào)用FutureTask對象的get()方法來獲得子線程執(zhí)行結(jié)束后的返回值。三種實現(xiàn)多線程方式的對比分析前面講解了可以通過三種方式創(chuàng)建線程,包括繼承Thread類、實現(xiàn)Runnable接口和實現(xiàn)Callable接口的方式,接下來介紹一下這三種創(chuàng)建線程方式的優(yōu)點和弊端。1.繼承Thread類創(chuàng)建線程優(yōu)點:編寫簡單,如果需要訪問當(dāng)前線程,則無須使用Thread.currentThread()方法,直接使用this即可獲得當(dāng)前線程。弊端:線程類已經(jīng)繼承了Thread類,所以不能再繼承其他父類。2.實現(xiàn)Runnable接口創(chuàng)建線程 優(yōu)點:避免由于Java單繼承帶來的局限性。 弊端:編程稍微復(fù)雜,如果要訪問當(dāng)前線程,則必須使用Thread.currentThread()方法。3.使用Callable接口和Future接口創(chuàng)建線程 優(yōu)點:避免由于Java單繼承帶來的局限性,有返回值,可以拋出異常。 弊端:編程稍微復(fù)雜,如果要訪問當(dāng)前線程,則必須使用Thread.currentThread()方法。如上列出了三種創(chuàng)建多線程方式的優(yōu)點和弊端,一般情況下推薦使用后兩種實現(xiàn)接口的方式創(chuàng)建多線程,實際開發(fā)中要根據(jù)實際需求確定使用哪種方式。線程的生命周期及狀態(tài)轉(zhuǎn)換前面講解了線程的創(chuàng)建,接下來了解一下線程的生命周期。線程有新建(New)、就緒(Runnable)、運行(Running)、阻塞(Blocked)和死亡(Terminated)五種狀態(tài),線程從新建到死亡稱為線程的生命周期,接下來了解一下線程的生命周期及狀態(tài)轉(zhuǎn)換,如圖所示。1.新建狀態(tài)當(dāng)程序使用new關(guān)鍵字創(chuàng)建一個線程后,該線程處于新建狀態(tài),此時它和其他Java對象一樣,在堆空間內(nèi)分配了一塊內(nèi)存,但還不能運行。2.就緒狀態(tài)當(dāng)一個線程對象創(chuàng)建后,其他線程調(diào)用它的start()方法,該線程就進(jìn)入就緒狀態(tài),Java虛擬機(jī)會為它創(chuàng)建方法調(diào)用棧和程序計數(shù)器。處于這個狀態(tài)的線程位于可運行池中,等待獲得CPU的使用權(quán)。3.運行狀態(tài)處于這個狀態(tài)的線程占用CPU,執(zhí)行程序代碼。在并發(fā)執(zhí)行時,如果計算機(jī)只有一個CPU,那么只會有一個線程處于運行狀態(tài)。如果計算機(jī)有多個CPU,那么同一時刻可以有多個線程占用不同CPU處于運行狀態(tài),只有處于就緒狀態(tài)的線程才可以轉(zhuǎn)換到運行狀態(tài)。4.阻塞狀態(tài)阻塞狀態(tài)是指線程因為某些原因放棄CPU,暫時停止運行。當(dāng)線程處于阻塞狀態(tài)時,Java虛擬機(jī)不會給線程分配CPU,直到線程重新進(jìn)入就緒狀態(tài),它才有機(jī)會轉(zhuǎn)換到運行狀態(tài)。5.死亡狀態(tài)(1)線程的run()方法正常執(zhí)行完成,線程正常結(jié)束。(2)線程拋出異常(Exception)或錯誤(Error)。(3)調(diào)用線程對象的stop()方法結(jié)束該線程。線程一旦轉(zhuǎn)換為死亡狀態(tài),就不能運行且不能轉(zhuǎn)換為其他狀態(tài)。線程的優(yōu)先級所有處于就緒狀態(tài)的線程根據(jù)優(yōu)先級存放在可運行池中,優(yōu)先級低的線程運行機(jī)會較少,優(yōu)先級高的線程運行機(jī)會更多。Thread類的setPriority(intnewPriority)方法和getPriority()方法分別用于設(shè)置優(yōu)先級和讀取優(yōu)先級。優(yōu)先級用整數(shù)表示,取值范圍1~10,除了直接用數(shù)字表示線程的優(yōu)先級,還可以用Thread類中提供的三個靜態(tài)常量來表示線程的優(yōu)先級,如表所示。線程休眠前面講解了線程的優(yōu)先級,可以發(fā)現(xiàn)將需要后執(zhí)行的線程設(shè)置為低優(yōu)先級,也有一定幾率先執(zhí)行該線程,可以用Thread類的靜態(tài)方法sleep()來解決這一問題,sleep()方法有兩種重載形式,具體示例如下。如上所示是sleep()方法的兩種重載形式,前者參數(shù)是指定線程休眠的毫秒數(shù),后者是指定線程休眠的毫秒數(shù)和毫微秒數(shù)。正在執(zhí)行的線程調(diào)用sleep()方法可以進(jìn)入阻塞狀態(tài),也叫線程休眠,在休眠時間內(nèi),即使系統(tǒng)中沒有其他可執(zhí)行的線程,該線程也不會獲得執(zhí)行的機(jī)會,當(dāng)休眠時間結(jié)束才可以執(zhí)行該線程。接下來用一個案例來演示線程休眠。如例所示。線程讓步前面講解了使用sleep()方法使線程阻塞,Thread類還提供一個yield()方法,它與sleep()方法類似,它也可以讓當(dāng)前正在執(zhí)行的線程暫停,但yield()方法不會使線程阻塞,只是將線程轉(zhuǎn)換為就緒狀態(tài),也就是讓當(dāng)前線程暫停一下,線程調(diào)度器重新調(diào)度一次,有可能還會將暫停的程序調(diào)度出來繼續(xù)執(zhí)行,這也稱為線程讓步。接下來用一個案例演示線程讓步。如例所示。線程插隊Thread類提供了一個join()方法,當(dāng)某個線程執(zhí)行中調(diào)用其他線程的join()方法時,此線程將被阻塞,直到被join()方法加入的線程執(zhí)行完為止,也稱為線程插隊。接下來用一個案例演示線程插隊,如例所示。后臺線程線程中還有一種后臺線程,它是為其他線程提供服務(wù)的,又稱為“守護(hù)線程”或“精靈線程”,JVM的垃圾回收線程就是典型的后臺線程。如果所有的前臺線程都死亡,后臺線程會自動死亡。當(dāng)整個虛擬機(jī)中只剩下后臺線程,程序就沒有繼續(xù)運行的必要了,所以虛擬機(jī)也就退出了。若將一個線程設(shè)置為后臺線程,可以調(diào)用Thread類的setDaemon(booleanon)方法,將參數(shù)指定為true即可,Thread類還提供了一個isDaemon()方法,用于判斷一個線程是否是后臺線程,接下來用一個案例演示后臺線程,示例代碼參考教材11.4.5節(jié)。第二課時(多線程同步、多線程通信、線程組和未處理的異常、線程池)內(nèi)容回顧回顧上節(jié)內(nèi)容,引出本課時主題。上節(jié)已經(jīng)介紹了進(jìn)程、線程、繼承Thread類創(chuàng)建線程、實現(xiàn)Runnable接口創(chuàng)建線程、使用Callable接口和Future接口創(chuàng)建線程、三種實現(xiàn)多線程方式的對比分析、線程的生命周期及狀態(tài)轉(zhuǎn)換、線程的優(yōu)先級、線程休眠、線程讓步、線程插隊、后臺線程,下面將介紹線程安全、同步代碼塊、同步方法、死鎖問題、多線程通信、線程組和未處理的異常和線程池。明確學(xué)習(xí)目標(biāo)能夠掌握線程安全能夠掌握同步代碼塊能夠掌握同步方法能夠掌握死鎖問題能夠掌握多線程通信能夠掌握線程組合未處理的異常能夠掌握線程池知識講解線程安全關(guān)于線程安全,有一個經(jīng)典的問題——窗口賣票的問題。窗口賣票的基本流程大致為首先知道共有多少張票,每賣掉一張票,票的總數(shù)要減1,多個窗口同時賣票,當(dāng)票數(shù)剩余0時說明沒有余票,停止售票。流程很簡單,但如果這個流程放在多線程并發(fā)的場景下,就存在問題,可能問題不會及時暴露出來,運行很多次才出一次問題。接下來用一個案例來演示這個賣票窗口的經(jīng)典問題,示例代碼參考教材11.5.1節(jié)。同步代碼塊前面提出了線程安全的問題,為了解決這個問題,Java的多線程引入了同步監(jiān)視器來解決這個問題,使用同步監(jiān)視器的通用方法就是同步代碼塊,具體示例如下。如上所示,synchronized關(guān)鍵字后括號里的obj就是同步監(jiān)視器,當(dāng)線程執(zhí)行同步代碼塊時,首先會檢查同步監(jiān)視器的標(biāo)志位,默認(rèn)情況下標(biāo)志位為1,線程會執(zhí)行同步代碼塊,同時將標(biāo)志位改為0,當(dāng)?shù)诙€線程執(zhí)行同步代碼塊前,檢查到標(biāo)志位為0,第二個線程會進(jìn)入阻塞狀態(tài),直到前一個線程執(zhí)行完同步代碼塊內(nèi)的操作,標(biāo)志位重新改為1,第二個線程才有可能進(jìn)入同步代碼塊。接下來通過修改例11-9的代碼演示用同步代碼塊解決線程安全問題,示例代碼參考教材11.5.2節(jié)。同步方法前面講解了用同步代碼塊解決線程安全問題,Java還提供了同步方法,即使用synchronized關(guān)鍵字修飾方法,該方法就是同步方法,同步方法的監(jiān)視器是this,也就是調(diào)用該方法的對象,同步方法也可以解決線程安全的問題,接下來通過修改例的代碼來演示用同步方法解決線程安全問題,示例代碼參考教材11.5.3節(jié)。程序的運行結(jié)果如圖所示。死鎖問題在多線程應(yīng)用中還存在死鎖的問題,不同的線程分別占用對方需要的同步資源不放棄,都在等待對方放棄自己需要的同步資源,就形成了線程的死鎖。接下來通過一個案例演示死鎖的情況,示例代碼參考教材11.5.4節(jié)。程序的運行結(jié)果如圖所示。在例中,當(dāng)TestDeadLock類的對象flag==1時(td1),先鎖定o1,睡眠500毫秒,而td1在睡眠的時候另一個flag==0的對象(td2)線程啟動,再鎖定o2,睡眠500毫秒,td1睡眠結(jié)束后需要鎖定o2才能繼續(xù)執(zhí)行,而此時o2已被td2鎖定;td2睡眠結(jié)束后需要鎖定o1才能繼續(xù)執(zhí)行,而此時o1已被td1鎖定;td1、td2相互等待,都需要得到對方鎖定的資源才能繼續(xù)執(zhí)行,從而死鎖,程序出現(xiàn)阻塞狀態(tài)。在編寫代碼時要盡量避免死鎖,采用專門的算法、原則,盡量減少同步資源的定義。此外,Thread類的suspend()方法也容易導(dǎo)致死鎖,已被標(biāo)記為過時的方法。多線程通信不同的線程執(zhí)行不同的任務(wù),如果這些任務(wù)有某種聯(lián)系,線程之間必須能夠通信,協(xié)調(diào)完成工作,例如,生產(chǎn)者和消費者互相操作倉庫,當(dāng)倉庫為空時,消費者無法從倉庫取出產(chǎn)品,應(yīng)該先通知生產(chǎn)者向倉庫中加入產(chǎn)品。當(dāng)倉庫已滿時,生產(chǎn)者無法繼續(xù)加入產(chǎn)品,應(yīng)該先通知消費者從倉庫取出產(chǎn)品。java.lang包中Object類提供了三個用于線程通信的方法,如表所示。表中列出了Object類提供的三個用于線程通信的方法,這里要注意的是,這三個方法只有在synchronized方法或synchronized代碼塊中才能使用,否則會報IllegalMonitorStateException異常。線程組和未處理的異常Java中使用ThreadGroup來表示線程組,它可以對一批線程進(jìn)行分類管理,Java允許程序直接對線程組進(jìn)行控制。用戶創(chuà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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年銀行擔(dān)保借款合同范本
- 上海健身服務(wù)合同范例
- 眾籌協(xié)議合同范例
- 公園養(yǎng)護(hù)合同范本
- cba新秀合同范本a合同
- 勞務(wù)派人員合同范例
- 個人汽車購車合同范例
- 農(nóng)村平房拆除合同范本
- 軍容保潔服務(wù)合同范例
- 中餐加盟協(xié)議合同范本
- 第十一章《功和機(jī)械能》達(dá)標(biāo)測試卷(含答案)2024-2025學(xué)年度人教版物理八年級下冊
- 2025年銷售部年度工作計劃
- 2024年蘇州工業(yè)園區(qū)服務(wù)外包職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測試歷年參考題庫含答案解析
- ESG表現(xiàn)對企業(yè)財務(wù)績效的影響研究
- DB3713T 340-2024 實景三維數(shù)據(jù)接口及服務(wù)發(fā)布技術(shù)規(guī)范
- 八年級生物開學(xué)摸底考(長沙專用)(考試版)
- (工作規(guī)范)公路預(yù)防性養(yǎng)護(hù)工作手冊
- 2024年高考全國甲卷英語試卷(含答案)
- 2024年湖南高速鐵路職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫附答案
- 2024年4月浙江省00015英語二試題及答案含評分參考
- 文化差異與跨文化交際課件(完整版)
評論
0/150
提交評論