Java程序設(shè)計實例教程-第8章.ppt
《Java程序設(shè)計實例教程-第8章.ppt》由會員分享,可在線閱讀,更多相關(guān)《Java程序設(shè)計實例教程-第8章.ppt(29頁珍藏版)》請在裝配圖網(wǎng)上搜索。
第8章多線程 本次課程內(nèi)容 認(rèn)識多線程線程概念創(chuàng)建多線程線程的 一生 線程的優(yōu)先級線程的同步 1 認(rèn)識多線程 當(dāng)我們使用電腦時 可以一邊聽音樂 一邊QQ聊天 一邊打游戲 一個CPU怎么可以同時作這么多事情呢 難道電腦真的可以同時運(yùn)行多個程序 真的嗎 在同一時間點執(zhí)行各項進(jìn)程 編譯程序發(fā)送 接收郵件打印文件其他 操作系統(tǒng)允許計算機(jī)同時執(zhí)行多項操作 程序 進(jìn)程 publicclassmainClass publicstaticvoidmain Stringagrs m1 publicstaticvoidm1 m2 m3 publicstaticvoidm2 publicstaticvoidm3 單線程 雙線程 2 線程概念 程序 進(jìn)程與多任務(wù)程序 program 是對數(shù)據(jù)描述與操作的代碼的集合 是應(yīng)用程序執(zhí)行的腳本 進(jìn)程 process 是程序的一次執(zhí)行過程 是系統(tǒng)運(yùn)行程序的基本單位 程序是靜態(tài)的 進(jìn)程是動態(tài)的 系統(tǒng)運(yùn)行一個程序即是一個進(jìn)程從創(chuàng)建 運(yùn)行到消亡的過程 多任務(wù) multitask 在一個系統(tǒng)中可以同時運(yùn)行多個程序 即有多個獨立運(yùn)行的任務(wù) 每個任務(wù)對應(yīng)一個進(jìn)程 線程線程 thread 就是比進(jìn)程更小的運(yùn)行單位 是程序中單個順序的流控制 一個進(jìn)程中可以包含多個線程 簡單來講 線程是一個獨立的執(zhí)行流 是進(jìn)程內(nèi)部的一個獨立執(zhí)行單元 相當(dāng)于一個子程序 3 創(chuàng)建多線程 JDK提供的相關(guān)類和接口 1 Runnable接口 就提供一個方法run 2 Thread類 實現(xiàn)了Runnable接口創(chuàng)建線程的兩種方法 創(chuàng)建Thread類的子類 重寫該類的run方法創(chuàng)建Runnable接口的實現(xiàn)類 實現(xiàn)接口中的run方法 方法一 創(chuàng)建Thread的子類 創(chuàng)建Thread的子類創(chuàng)建線程對象啟動線程start 方法可以啟動線程 開始執(zhí)行run 中代碼 即 run 內(nèi)代碼 不是調(diào)用執(zhí)行 而是啟動后 由虛擬機(jī)自動執(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)顯式繼承了一個其他的類怎么辦 方法二 創(chuàng)建Runnable接口的實現(xiàn)類 創(chuàng)建類實現(xiàn)接口classclassnameimplementsRunnable voidrun 創(chuàng)建該類對象 不是線程對象 還要借助Thread類 Thread 該類對象 啟動線程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啟動線程 JVM自動執(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 線程的 一生 線程的 一生 有幾個階段 1 創(chuàng)建 線程對象生成 2 就緒 start 啟動 等待運(yùn)行 3 運(yùn)行 CPU運(yùn)行run 代碼 4 阻塞 運(yùn)行過程中因為某種原因 讓出CPU 5 死亡 運(yùn)行完畢 線程結(jié)束 或拋出異常退出 造成 阻塞 的原因 1 yield 主動出讓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)先級的方法getPriority 獲取當(dāng)前線程的優(yōu)先級setPriority 設(shè)置當(dāng)前線程的優(yōu)先級Java語言為線程類設(shè)置了10個優(yōu)先級 分別使用1 10內(nèi)的整數(shù)表示 整數(shù)值越大代表優(yōu)先級越高 每個線程都有一個默認(rèn)的優(yōu)先級 主線程的默認(rèn)優(yōu)先級是5 Thread類定義的三個常量分別代表了幾個常用的優(yōu)先級 MAX PRIORITY 代表了最高優(yōu)先級10MIN PRIORITY 代表了最低優(yōu)先級1NORM PRIORITY 代表了正常優(yōu)先級5 5 線程的優(yōu)先級 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)生的問題實例 銀行的一個賬戶 Bankbank newBank 0001 2000 兩張卡 線程 Operation 1 bank 1200 start Operation 2 bank 1200 start 6 線程的同步 0001 2000 產(chǎn)生這種問題的原因是對共享資源訪問的不完整 為了解決這種問題 需要尋找一種機(jī)制來保證對共享數(shù)據(jù)操作的完整性 這種完整性稱為共享數(shù)據(jù)操作的同步 在Java語言中 引入了 對象互斥鎖 的概念 對象互斥鎖 阻止多個線程同時訪問同一個變量 在Java語言中 對象互斥鎖 的實現(xiàn) 用關(guān)鍵字synchronized來聲明一個操作共享數(shù)據(jù)的方法或一段代碼 Java對象鎖 用synchronized來標(biāo)識的代碼段或方法即為 對象互斥鎖 鎖住的部分 如果一個程序內(nèi)有兩個或以上的方法使用synchronized標(biāo)志 則它們在同一個 對象互斥鎖 管理之下 使用 synchronized 關(guān)鍵字 1修飾方法被 synchronized 關(guān)鍵字修飾的方法稱為 同步方法 當(dāng)一個線程訪問對象的同步方法時 被訪問對象就處于 鎖定 狀態(tài) 訪問該方法的其他線程只能等待 對象中的其他同步方法也不能訪問 但非同步方法則可以訪問 使用 synchronized 關(guān)鍵字 2修飾部分代碼如果只希望同步部分代碼行 可以使用 同步塊 同步塊的作用與同步方法一樣 只是控制范圍有所區(qū)別 在多線程應(yīng)用程序中 obj代表被鎖定的共享對象- 1.請仔細(xì)閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- Java 程序設(shè)計 實例教程
鏈接地址:http://m.jqnhouse.com/p-6361723.html