Java程序設(shè)計(jì)實(shí)例教程-第8章.ppt
《Java程序設(shè)計(jì)實(shí)例教程-第8章.ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《Java程序設(shè)計(jì)實(shí)例教程-第8章.ppt(29頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
第8章多線程 本次課程內(nèi)容 認(rèn)識(shí)多線程線程概念創(chuàng)建多線程線程的 一生 線程的優(yōu)先級(jí)線程的同步 1 認(rèn)識(shí)多線程 當(dāng)我們使用電腦時(shí) 可以一邊聽音樂 一邊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 單線程 雙線程 2 線程概念 程序 進(jìn)程與多任務(wù)程序 program 是對(duì)數(shù)據(jù)描述與操作的代碼的集合 是應(yīng)用程序執(zhí)行的腳本 進(jìn)程 process 是程序的一次執(zhí)行過程 是系統(tǒng)運(yùn)行程序的基本單位 程序是靜態(tài)的 進(jìn)程是動(dòng)態(tài)的 系統(tǒng)運(yùn)行一個(gè)程序即是一個(gè)進(jìn)程從創(chuàng)建 運(yùn)行到消亡的過程 多任務(wù) multitask 在一個(gè)系統(tǒng)中可以同時(shí)運(yùn)行多個(gè)程序 即有多個(gè)獨(dú)立運(yùn)行的任務(wù) 每個(gè)任務(wù)對(duì)應(yīng)一個(gè)進(jìn)程 線程線程 thread 就是比進(jìn)程更小的運(yùn)行單位 是程序中單個(gè)順序的流控制 一個(gè)進(jìn)程中可以包含多個(gè)線程 簡單來講 線程是一個(gè)獨(dú)立的執(zhí)行流 是進(jìn)程內(nèi)部的一個(gè)獨(dú)立執(zhí)行單元 相當(dāng)于一個(gè)子程序 3 創(chuàng)建多線程 JDK提供的相關(guān)類和接口 1 Runnable接口 就提供一個(gè)方法run 2 Thread類 實(shí)現(xiàn)了Runnable接口創(chuàng)建線程的兩種方法 創(chuàng)建Thread類的子類 重寫該類的run方法創(chuàng)建Runnable接口的實(shí)現(xiàn)類 實(shí)現(xiàn)接口中的run方法 方法一 創(chuàng)建Thread的子類 創(chuàng)建Thread的子類創(chuàng)建線程對(duì)象啟動(dòng)線程start 方法可以啟動(dòng)線程 開始執(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 線程 getName 正在打印 i publicstaticvoidmain String args System out println main開始執(zhí)行 MyThreadmt newMyThread MyThreadmt2 newMyThread mt start mt2 start for inti 1 i 30 i System out println 線程main正在打印 i 線程練習(xí)一 管道流 PipedOuputStream PipeInputStream 方法一 PipedInputStreamin newPipedInputStream PipedOutputStreamout newPipedOutputStream in 方法二 PipedInputStreamin newPipedInputStream PipedOutputStreamout newPipedOutputStream In connect out out connect in 問題 要定義的線程類已經(jīng)顯式繼承了一個(gè)其他的類怎么辦 方法二 創(chuàng)建Runnable接口的實(shí)現(xiàn)類 創(chuàng)建類實(shí)現(xiàn)接口classclassnameimplementsRunnable voidrun 創(chuàng)建該類對(duì)象 不是線程對(duì)象 還要借助Thread類 Thread 該類對(duì)象 啟動(dòng)線程start classMyRunnableimplementsRunnable publicvoidrun for inti 1 i 30 i System out println 線程 Thread currentThread getName 正在打印 i publicstaticvoidmain String args System out println main開始執(zhí)行 MyRunnablemr newMyRunnable Threadt newThread mr t start for inti 1 i 30 i System out println 線程main正在打印 i run不可以調(diào)用 start啟動(dòng)線程 JVM自動(dòng)執(zhí)行run classMyRunnableimplementsRunnable publicvoidrun for inti 1 i 30 i System out println 線程 Thread currentThread getName 正在打印 i publicstaticvoidmain String args System out println main開始執(zhí)行 MyRunnablemr newMyRunnable Threadt newThread mr t run for inti 1 i 30 i System out println 線程main正在打印 i 4 線程的 一生 線程的 一生 有幾個(gè)階段 1 創(chuàng)建 線程對(duì)象生成 2 就緒 start 啟動(dòng) 等待運(yùn)行 3 運(yùn)行 CPU運(yùn)行run 代碼 4 阻塞 運(yùn)行過程中因?yàn)槟撤N原因 讓出CPU 5 死亡 運(yùn)行完畢 線程結(jié)束 或拋出異常退出 造成 阻塞 的原因 1 yield 主動(dòng)出讓CPU 2 sleep 累了 休息一下 3 join 合并線程 暫停 4 I O操作 進(jìn)行數(shù)據(jù)輸出 暫停代碼運(yùn)行結(jié)束阻塞 1 休眠結(jié)束 2 join 執(zhí)行完 3 輸入 出操作執(zhí)行完 4 調(diào)用Interrupt 打斷休眠 Thread類提供了獲取和設(shè)置線程優(yōu)先級(jí)的方法getPriority 獲取當(dāng)前線程的優(yōu)先級(jí)setPriority 設(shè)置當(dāng)前線程的優(yōu)先級(jí)Java語言為線程類設(shè)置了10個(gè)優(yōu)先級(jí) 分別使用1 10內(nèi)的整數(shù)表示 整數(shù)值越大代表優(yōu)先級(jí)越高 每個(gè)線程都有一個(gè)默認(rèn)的優(yōu)先級(jí) 主線程的默認(rèn)優(yōu)先級(jí)是5 Thread類定義的三個(gè)常量分別代表了幾個(gè)常用的優(yōu)先級(jí) MAX PRIORITY 代表了最高優(yōu)先級(jí)10MIN PRIORITY 代表了最低優(yōu)先級(jí)1NORM PRIORITY 代表了正常優(yōu)先級(jí)5 5 線程的優(yōu)先級(jí) classMyThreadextendsThread publicvoidrun for inti 1 i 30 i System out println 線程 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 線程間 共享 數(shù)據(jù)產(chǎn)生的問題實(shí)例 銀行的一個(gè)賬戶 Bankbank newBank 0001 2000 兩張卡 線程 Operation 1 bank 1200 start Operation 2 bank 1200 start 6 線程的同步 0001 2000 產(chǎn)生這種問題的原因是對(duì)共享資源訪問的不完整 為了解決這種問題 需要尋找一種機(jī)制來保證對(duì)共享數(shù)據(jù)操作的完整性 這種完整性稱為共享數(shù)據(jù)操作的同步 在Java語言中 引入了 對(duì)象互斥鎖 的概念 對(duì)象互斥鎖 阻止多個(gè)線程同時(shí)訪問同一個(gè)變量 在Java語言中 對(duì)象互斥鎖 的實(shí)現(xiàn) 用關(guān)鍵字synchronized來聲明一個(gè)操作共享數(shù)據(jù)的方法或一段代碼 Java對(duì)象鎖 用synchronized來標(biāo)識(shí)的代碼段或方法即為 對(duì)象互斥鎖 鎖住的部分 如果一個(gè)程序內(nèi)有兩個(gè)或以上的方法使用synchronized標(biāo)志 則它們?cè)谕粋€(gè) 對(duì)象互斥鎖 管理之下 使用 synchronized 關(guān)鍵字 1修飾方法被 synchronized 關(guān)鍵字修飾的方法稱為 同步方法 當(dāng)一個(gè)線程訪問對(duì)象的同步方法時(shí) 被訪問對(duì)象就處于 鎖定 狀態(tài) 訪問該方法的其他線程只能等待 對(duì)象中的其他同步方法也不能訪問 但非同步方法則可以訪問 使用 synchronized 關(guān)鍵字 2修飾部分代碼如果只希望同步部分代碼行 可以使用 同步塊 同步塊的作用與同步方法一樣 只是控制范圍有所區(qū)別 在多線程應(yīng)用程序中 obj代表被鎖定的共享對(duì)象- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐ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ì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- Java 程序設(shè)計(jì) 實(shí)例教程
鏈接地址:http://m.jqnhouse.com/p-6361723.html