java視頻教程多線程程序設(shè)計(jì).ppt
《java視頻教程多線程程序設(shè)計(jì).ppt》由會員分享,可在線閱讀,更多相關(guān)《java視頻教程多線程程序設(shè)計(jì).ppt(27頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1 第22講多線程程序設(shè)計(jì) 線程的概念線程的創(chuàng)建線程調(diào)度與線程控制線程狀態(tài)與生命周期 多線程與并發(fā)編程 把一個問題切割分成多個可獨(dú)立運(yùn)行的部分 從而提高程序的相應(yīng)能力 在程序中 這些彼此獨(dú)立運(yùn)行的部分稱之為線程 thread 線程共享存儲空間JVM允許應(yīng)用程序并發(fā)執(zhí)行多個線程 2 3 程序與進(jìn)程 程序是指令的集合 包括對數(shù)據(jù)的描述以及對數(shù)據(jù)的操作 告訴計(jì)算機(jī)如何完成一個任務(wù) 進(jìn)程進(jìn)程通常被認(rèn)為是一個程序的一次動態(tài)執(zhí)行過程 一個進(jìn)程具有一組完整的 私有的基本運(yùn)行時(shí)資源 特別是內(nèi)存空間是獨(dú)立的 不會與其他進(jìn)程共享 4 線程 線程是進(jìn)程中的一個執(zhí)行流 一組程序指令的順序流 線程是處理器的調(diào)度單位 一個進(jìn)程包含一個或多個線程 它們共享該進(jìn)程的資源 如 內(nèi)存和打開的文件等 程序的執(zhí)行從一個線程開始 這個線程稱為主線程 JAVA可以實(shí)現(xiàn)一個進(jìn)程中多線程的 并發(fā) 執(zhí)行 從而使一個進(jìn)程 同時(shí) 執(zhí)行多個任務(wù) 在多處理器 或多核 系統(tǒng)中 這種并發(fā)是真實(shí)的 在單處理器系統(tǒng)中 這種并發(fā)是通過線程的交替執(zhí)行來模擬的 線程的狀態(tài) 新建 new就緒 runnable運(yùn)行 running阻塞 locking睡眠 sleeping等待 waiting中止 dead 6 線程狀態(tài)及其變遷 終止 就緒 可運(yùn)行 運(yùn)行 睡眠 擁塞 等待 timeover sleep stop wait timeover Lackofsource ready attemper 創(chuàng)建可執(zhí)行線程 創(chuàng)建java lang Thread類的子類重寫Thread父類的run 方法通過子類的實(shí)例化 調(diào)用start 方法執(zhí)行線程創(chuàng)建java lang Runnable接口的實(shí)現(xiàn)類實(shí)現(xiàn)類必須實(shí)現(xiàn)run 方法用實(shí)現(xiàn)類的實(shí)例作為參數(shù) 調(diào)用Thread類的構(gòu)造器再通過調(diào)用Thread類的start 方法創(chuàng)建并運(yùn)行線程 7 8 Java線程類Java lang Thread Thread類的實(shí)例就是線程 用戶通過編寫Thread的子類來構(gòu)造自己的線程 publicUserThreadextendsThread publicvoidrun overriderun方法 9 通過編寫Thread的子類創(chuàng)建線程示例 ClassXyzextendsThread inti 線程的數(shù)據(jù)定義publicvoidrun 線程的代碼定義 覆蓋run方法 while true System out println Hello i if i 5 break publicclassThreadTest publicstaticvoidmain Stringargs Threadt newXyz 直接實(shí)例化Thread的子類Xyz創(chuàng)建線程t start 啟動線程 10 Java線程接口java lang Runnable Runnable的定義 publicinterfaceRunnable voidrun 該接口只定義了一個run 方法 定義一個類實(shí)現(xiàn)Runnable接口 publicUserRunimplementsRunnable publicvoidrun implementrun方法 11 通過實(shí)現(xiàn)Runnable接口創(chuàng)建線程 定義一個類實(shí)現(xiàn)Runnable接口 classUserRunimplementsRunnable將該類的實(shí)例作為參數(shù)傳給Thread類的構(gòu)造方法 從而創(chuàng)建一個線程對象 并通過該對象調(diào)用start方法啟動線程執(zhí)行 Runnablerunner newnewUserRun Threadt newThread runner t start 12 通過實(shí)現(xiàn)Runnable接口線程創(chuàng)建示例 ClassXyzimplementsRunnable inti 線程的數(shù)據(jù)定義publicvoidrun 線程的代碼定義 實(shí)現(xiàn)run方法 while true System out println Hello i if i 5 break publicclassThreadTest publicstaticvoidmain Stringargs Xyzr newXyz 線程體對象Threadt newThread r 以線程體對象為參數(shù)創(chuàng)建線程t start 啟動線程 13 線程的創(chuàng)建 一個線程是Thread或其子類的對象 Thread的構(gòu)造方法如下 publicThread publicThread Stringname publicThread Runnabletarget publicThread Runnabletarget Stringname publicThread ThreadGroupgroup Stringname publicThread ThreadGroupgroup Runnabletarget publicThread ThreadGroupgroup Runnabletarget Stringname 14 兩種線程創(chuàng)建方法的比較 由于Java的單繼承性 繼承Thread類的子類無法同時(shí)繼承其他類 而實(shí)現(xiàn)Runnable的接口不影響繼續(xù)繼承其他類 繼承Thread類實(shí)現(xiàn)的多線程 無法實(shí)現(xiàn)多個線程操縱同一個對象 實(shí)現(xiàn)Runnable接口的多線程 可以實(shí)現(xiàn)多個線程訪問同一個對象 15 Thread類的常用方法 voidinterrupt staticbooleaninterrupted voidjoin voidsetDaemon booleanon voidsetName Stringname voidsetPriority intnewPriority staticvoidsleep longmillis voidstart StringtoString staticvoidyield 16 線程的啟動 新創(chuàng)建的線程不會自動運(yùn)行 通過start 方法啟動線程 start 方法把線程置為可運(yùn)行 Runnable 狀態(tài) 使得該線程可以參與調(diào)度 被Java虛擬機(jī) JVM 運(yùn)行 注意 啟動線程并不意味著該線程會立即執(zhí)行 什么時(shí)候執(zhí)行依賴于JVM的調(diào)度 run 方法與start 方法的區(qū)別調(diào)用start 方法是啟動一個新的線程 該線程將參與線程調(diào)度 當(dāng)線程被調(diào)度執(zhí)行時(shí) 會運(yùn)行run 方法 而直接調(diào)用run 方法 只是將其作為普通方法執(zhí)行 并非開啟一個新的線程 達(dá)不到多線程并發(fā)運(yùn)行的目的 注意 一個線程對象的start 方法只能執(zhí)行一次 線程的調(diào)度 選擇線程執(zhí)行的過程就叫做線程調(diào)度 JVM進(jìn)行線程調(diào)度時(shí)采用搶先式調(diào)度算法 由優(yōu)先級決定線程執(zhí)行的優(yōu)先權(quán)所有可運(yùn)行線程按優(yōu)先級保存在緩沖池中 線程的優(yōu)先級越高 其被執(zhí)行的概率越大 共有十個優(yōu)先級 每個優(yōu)先級有一個等待池 JVM先運(yùn)行高優(yōu)先級池中的線程 待該池空后才考慮低優(yōu)先級線程 一個時(shí)刻只能一個線程在運(yùn)行 17 18 線程調(diào)度策略詳解 優(yōu)先級相同的線程有分時(shí)與獨(dú)占兩種調(diào)度方式 在獨(dú)占模式下 由JVM選定線程執(zhí)行 直到其運(yùn)行到不再可運(yùn)行 或另一個更高優(yōu)先級的線程搶在到JVM 成為可運(yùn)行線程 該線程才不再運(yùn)行 在分時(shí)模式下 同一優(yōu)先級的等待池中的線程輪流運(yùn)行 每隔一定的時(shí)間 讓出JVM的使用權(quán) 線程一般可用sleep 方法保證給其他線程讓出運(yùn)行時(shí)間 線程的調(diào)度 休眠 休眠 sleep 使當(dāng)前線程停止執(zhí)行一段時(shí)間線程的狀態(tài)由Running sleepsleep方法 staticvoidsleep longmillis 作用 暫停當(dāng)前執(zhí)行的線程參數(shù)為停止的毫秒數(shù)方法可能拋出InterruptedException異常注意 不處于運(yùn)行狀態(tài)的線程不能被暫停執(zhí)行指定的時(shí)間結(jié)束后 線程將進(jìn)入可運(yùn)行狀態(tài) 不一定能馬上恢復(fù)執(zhí)行 19 20 多線程并發(fā)執(zhí)行舉例 classTestMultiThreads publicstaticvoidmain String args Threadt1 newThread newT1 1 Threadt2 newThread newT1 2 t1 start t2 start System out println main方法結(jié)束 classT1implementsRunnable privateintid publicT1 intid this id id publicvoidrun while true System out println IamThread id try Thread sleep int Math random 2000 catch InterruptedExceptione 線程的調(diào)度 優(yōu)先級 優(yōu)先權(quán) priority 用于描述線程的重要性每個線程具有優(yōu)先級 從低到高分為1 10共10個級別 默認(rèn)的優(yōu)先級為5 Thread類中定義了三個優(yōu)先級常量 Thread MIN PRIORITY 1Thread MAX PRIORITY 10Thread NORM PRIORITY 5與優(yōu)先級有關(guān)的方法intgetPriority 獲取線程優(yōu)先級voidsetPrioroty intnewPriority 設(shè)置線程優(yōu)先級 21 優(yōu)先級 join 加入到某個線程如果某個線程t1 在另一個線程t2上調(diào)用join方法 t1 join 則t2將被掛起 直到目標(biāo)線程t1執(zhí)行結(jié)束才恢復(fù)t2的執(zhí)行 runnable狀態(tài) publicfinalvoidjoin publicfinalvoidjoin longmillis publicfinalvoidjoin longmillis intnanos 后者只等指定的時(shí)間 可能拋出InterruptedException異常 22 23 線程中斷 Interrupt 中斷線程 并設(shè)置中斷標(biāo)志 相關(guān)方法 voidinterrupt 使得線程提前結(jié)束執(zhí)行 會產(chǎn)生InterruptedException異常 booleaninterrupted 測試當(dāng)前線程是否被中斷 如果是則返回true 并清除中斷標(biāo)志 24 后臺 daemon 線程 線程可以分為后臺線程和用戶線程 如果一個程序只有后臺線程在運(yùn)行 則程序會立即退出 如果有用戶線程在運(yùn)行 則程序不會終止 后臺線程通常用于為其他線程提供服務(wù) 線程默認(rèn)為用戶線程 在線程啟動之前 可以用setDaemon方法將線程設(shè)置為后臺線程 publicfinalvoidsetDaemon booleanon 25 線程組 線程組是將線程進(jìn)行分組管理的一種方法 一個線程組可以是一些線程和線程組的集合 每個Java線程都?xì)w屬于一個線程組 線程組由java lang中的ThreadGroup類實(shí)現(xiàn) 線程屬于某個線程組具有永久性 不允許改變 缺省線程組在JavaApplication啟動時(shí) 運(yùn)行系統(tǒng)創(chuàng)建缺省的線程組 稱為main 所有未指定組的線程 均屬于該組 未指定組的線程 將屬于其 父線程 所在線程組 26 創(chuàng)建線程組 通過ThreadGroup類的構(gòu)造方法可以創(chuàng)建線程組 publicThreadGroup StringgroupName publicThreadGroup ThreadGroupparentGroup StringgroupName 27 指定線程所屬的線程組 通過線程的構(gòu)造方法創(chuàng)建屬于某個線程組的線程publicThread ThreadGroupgroup Stringname publicThread ThreadGroupgroup Runnabletarget publicThread ThreadGroupgroup Runnabletarget Stringname 例 查看線程所屬的線程組- 1.請仔細(xì)閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- java 視頻教程 多線程 程序設(shè)計(jì)
鏈接地址:http://appdesigncorp.com/p-8621150.html