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