Java程序設(shè)計(jì)實(shí)例教程-第8章.ppt
-
資源ID:6361723
資源大?。?span id="q51hzhu" class="font-tahoma">945.50KB
全文頁(yè)數(shù):29頁(yè)
- 資源格式: PPT
下載積分:9.9積分
快捷下載
會(huì)員登錄下載
微信登錄下載
微信掃一掃登錄
友情提示
2、PDF文件下載后,可能會(huì)被瀏覽器默認(rèn)打開(kāi),此種情況可以點(diǎn)擊瀏覽器菜單,保存網(wǎng)頁(yè)到桌面,就可以正常下載了。
3、本站不支持迅雷下載,請(qǐng)使用電腦自帶的IE瀏覽器,或者360瀏覽器、谷歌瀏覽器下載即可。
4、本站資源下載后的文檔和圖紙-無(wú)水印,預(yù)覽文檔經(jīng)過(guò)壓縮,下載后原文更清晰。
5、試題試卷類(lèi)文檔,如果標(biāo)題沒(méi)有明確說(shuō)明有答案則都視為沒(méi)有答案,請(qǐng)知曉。
|
Java程序設(shè)計(jì)實(shí)例教程-第8章.ppt
第8章多線(xiàn)程 本次課程內(nèi)容 認(rèn)識(shí)多線(xiàn)程線(xiàn)程概念創(chuàng)建多線(xiàn)程線(xiàn)程的 一生 線(xiàn)程的優(yōu)先級(jí)線(xiàn)程的同步 1 認(rèn)識(shí)多線(xiàn)程 當(dāng)我們使用電腦時(shí) 可以一邊聽(tīng)音樂(lè) 一邊QQ聊天 一邊打游戲 一個(gè)CPU怎么可以同時(shí)作這么多事情呢 難道電腦真的可以同時(shí)運(yùn)行多個(gè)程序 真的嗎 在同一時(shí)間點(diǎn)執(zhí)行各項(xiàng)進(jìn)程 編譯程序發(fā)送 接收郵件打印文件其他 操作系統(tǒng)允許計(jì)算機(jī)同時(shí)執(zhí)行多項(xiàng)操作 程序 進(jìn)程 publicclassmainClass publicstaticvoidmain Stringagrs m1 publicstaticvoidm1 m2 m3 publicstaticvoidm2 publicstaticvoidm3 單線(xiàn)程 雙線(xiàn)程 2 線(xiàn)程概念 程序 進(jìn)程與多任務(wù)程序 program 是對(duì)數(shù)據(jù)描述與操作的代碼的集合 是應(yīng)用程序執(zhí)行的腳本 進(jìn)程 process 是程序的一次執(zhí)行過(guò)程 是系統(tǒng)運(yùn)行程序的基本單位 程序是靜態(tài)的 進(jìn)程是動(dòng)態(tài)的 系統(tǒng)運(yùn)行一個(gè)程序即是一個(gè)進(jìn)程從創(chuàng)建 運(yùn)行到消亡的過(guò)程 多任務(wù) multitask 在一個(gè)系統(tǒng)中可以同時(shí)運(yùn)行多個(gè)程序 即有多個(gè)獨(dú)立運(yùn)行的任務(wù) 每個(gè)任務(wù)對(duì)應(yīng)一個(gè)進(jìn)程 線(xiàn)程線(xiàn)程 thread 就是比進(jìn)程更小的運(yùn)行單位 是程序中單個(gè)順序的流控制 一個(gè)進(jìn)程中可以包含多個(gè)線(xiàn)程 簡(jiǎn)單來(lái)講 線(xiàn)程是一個(gè)獨(dú)立的執(zhí)行流 是進(jìn)程內(nèi)部的一個(gè)獨(dú)立執(zhí)行單元 相當(dāng)于一個(gè)子程序 3 創(chuàng)建多線(xiàn)程 JDK提供的相關(guān)類(lèi)和接口 1 Runnable接口 就提供一個(gè)方法run 2 Thread類(lèi) 實(shí)現(xiàn)了Runnable接口創(chuàng)建線(xiàn)程的兩種方法 創(chuàng)建Thread類(lèi)的子類(lèi) 重寫(xiě)該類(lèi)的run方法創(chuàng)建Runnable接口的實(shí)現(xiàn)類(lèi) 實(shí)現(xiàn)接口中的run方法 方法一 創(chuàng)建Thread的子類(lèi) 創(chuàng)建Thread的子類(lèi)創(chuàng)建線(xiàn)程對(duì)象啟動(dòng)線(xiàn)程start 方法可以啟動(dòng)線(xiàn)程 開(kāi)始執(zhí)行run 中代碼 即 run 內(nèi)代碼 不是調(diào)用執(zhí)行 而是啟動(dòng)后 由虛擬機(jī)自動(dòng)執(zhí)行的 classMyThreadextendsThread publicvoidrun for inti 1 i 30 i System out println 線(xiàn)程 getName 正在打印 i publicstaticvoidmain String args System out println main開(kāi)始執(zhí)行 MyThreadmt newMyThread MyThreadmt2 newMyThread mt start mt2 start for inti 1 i 30 i System out println 線(xiàn)程main正在打印 i 線(xiàn)程練習(xí)一 管道流 PipedOuputStream PipeInputStream 方法一 PipedInputStreamin newPipedInputStream PipedOutputStreamout newPipedOutputStream in 方法二 PipedInputStreamin newPipedInputStream PipedOutputStreamout newPipedOutputStream In connect out out connect in 問(wèn)題 要定義的線(xiàn)程類(lèi)已經(jīng)顯式繼承了一個(gè)其他的類(lèi)怎么辦 方法二 創(chuàng)建Runnable接口的實(shí)現(xiàn)類(lèi) 創(chuàng)建類(lèi)實(shí)現(xiàn)接口classclassnameimplementsRunnable voidrun 創(chuàng)建該類(lèi)對(duì)象 不是線(xiàn)程對(duì)象 還要借助Thread類(lèi) Thread 該類(lèi)對(duì)象 啟動(dòng)線(xiàn)程start classMyRunnableimplementsRunnable publicvoidrun for inti 1 i 30 i System out println 線(xiàn)程 Thread currentThread getName 正在打印 i publicstaticvoidmain String args System out println main開(kāi)始執(zhí)行 MyRunnablemr newMyRunnable Threadt newThread mr t start for inti 1 i 30 i System out println 線(xiàn)程main正在打印 i run不可以調(diào)用 start啟動(dòng)線(xiàn)程 JVM自動(dòng)執(zhí)行run classMyRunnableimplementsRunnable publicvoidrun for inti 1 i 30 i System out println 線(xiàn)程 Thread currentThread getName 正在打印 i publicstaticvoidmain String args System out println main開(kāi)始執(zhí)行 MyRunnablemr newMyRunnable Threadt newThread mr t run for inti 1 i 30 i System out println 線(xiàn)程main正在打印 i 4 線(xiàn)程的 一生 線(xiàn)程的 一生 有幾個(gè)階段 1 創(chuàng)建 線(xiàn)程對(duì)象生成 2 就緒 start 啟動(dòng) 等待運(yùn)行 3 運(yùn)行 CPU運(yùn)行run 代碼 4 阻塞 運(yùn)行過(guò)程中因?yàn)槟撤N原因 讓出CPU 5 死亡 運(yùn)行完畢 線(xiàn)程結(jié)束 或拋出異常退出 造成 阻塞 的原因 1 yield 主動(dòng)出讓CPU 2 sleep 累了 休息一下 3 join 合并線(xiàn)程 暫停 4 I O操作 進(jìn)行數(shù)據(jù)輸出 暫停代碼運(yùn)行結(jié)束阻塞 1 休眠結(jié)束 2 join 執(zhí)行完 3 輸入 出操作執(zhí)行完 4 調(diào)用Interrupt 打斷休眠 Thread類(lèi)提供了獲取和設(shè)置線(xiàn)程優(yōu)先級(jí)的方法getPriority 獲取當(dāng)前線(xiàn)程的優(yōu)先級(jí)setPriority 設(shè)置當(dāng)前線(xiàn)程的優(yōu)先級(jí)Java語(yǔ)言為線(xiàn)程類(lèi)設(shè)置了10個(gè)優(yōu)先級(jí) 分別使用1 10內(nèi)的整數(shù)表示 整數(shù)值越大代表優(yōu)先級(jí)越高 每個(gè)線(xiàn)程都有一個(gè)默認(rèn)的優(yōu)先級(jí) 主線(xiàn)程的默認(rèn)優(yōu)先級(jí)是5 Thread類(lèi)定義的三個(gè)常量分別代表了幾個(gè)常用的優(yōu)先級(jí) MAX PRIORITY 代表了最高優(yōu)先級(jí)10MIN PRIORITY 代表了最低優(yōu)先級(jí)1NORM PRIORITY 代表了正常優(yōu)先級(jí)5 5 線(xiàn)程的優(yōu)先級(jí) classMyThreadextendsThread publicvoidrun for inti 1 i 30 i System out println 線(xiàn)程 Thread currentThread getName 正在打印 i classThreadTest publicstaticvoidmain String args System out println Thread currentThread getPriority MyThreadmt1 newMyThread MyThreadmt2 newMyThread MyThreadmt3 newMyThread mt1 setPriority MIN PRIORITY mt3 setPriority MAX PRIORITY mt1 start mt2 start mt3 start 線(xiàn)程間 共享 數(shù)據(jù)產(chǎn)生的問(wèn)題實(shí)例 銀行的一個(gè)賬戶(hù) Bankbank newBank 0001 2000 兩張卡 線(xiàn)程 Operation 1 bank 1200 start Operation 2 bank 1200 start 6 線(xiàn)程的同步 0001 2000 產(chǎn)生這種問(wèn)題的原因是對(duì)共享資源訪(fǎng)問(wèn)的不完整 為了解決這種問(wèn)題 需要尋找一種機(jī)制來(lái)保證對(duì)共享數(shù)據(jù)操作的完整性 這種完整性稱(chēng)為共享數(shù)據(jù)操作的同步 在Java語(yǔ)言中 引入了 對(duì)象互斥鎖 的概念 對(duì)象互斥鎖 阻止多個(gè)線(xiàn)程同時(shí)訪(fǎng)問(wèn)同一個(gè)變量 在Java語(yǔ)言中 對(duì)象互斥鎖 的實(shí)現(xiàn) 用關(guān)鍵字synchronized來(lái)聲明一個(gè)操作共享數(shù)據(jù)的方法或一段代碼 Java對(duì)象鎖 用synchronized來(lái)標(biāo)識(shí)的代碼段或方法即為 對(duì)象互斥鎖 鎖住的部分 如果一個(gè)程序內(nèi)有兩個(gè)或以上的方法使用synchronized標(biāo)志 則它們?cè)谕粋€(gè) 對(duì)象互斥鎖 管理之下 使用 synchronized 關(guān)鍵字 1修飾方法被 synchronized 關(guān)鍵字修飾的方法稱(chēng)為 同步方法 當(dāng)一個(gè)線(xiàn)程訪(fǎng)問(wèn)對(duì)象的同步方法時(shí) 被訪(fǎng)問(wèn)對(duì)象就處于 鎖定 狀態(tài) 訪(fǎng)問(wèn)該方法的其他線(xiàn)程只能等待 對(duì)象中的其他同步方法也不能訪(fǎng)問(wèn) 但非同步方法則可以訪(fǎng)問(wèn) 使用 synchronized 關(guān)鍵字 2修飾部分代碼如果只希望同步部分代碼行 可以使用 同步塊 同步塊的作用與同步方法一樣 只是控制范圍有所區(qū)別 在多線(xiàn)程應(yīng)用程序中 obj代表被鎖定的共享對(duì)象