JAVA應(yīng)用22--5.28.ppt_第1頁
JAVA應(yīng)用22--5.28.ppt_第2頁
JAVA應(yīng)用22--5.28.ppt_第3頁
JAVA應(yīng)用22--5.28.ppt_第4頁
JAVA應(yīng)用22--5.28.ppt_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

多線程基礎(chǔ)知識錢新杰 1 使用相對URL地址一般要使用getCodeBase和getDocumentBase兩個方法 簡述其作用 2 簡述g drawImage picture x y width height this 各參數(shù)的作用 復(fù)習(xí)提問 線程的基本概念線程的屬性線程的優(yōu)先級 本次課學(xué)習(xí)目標(biāo) 我們已經(jīng)對多任務(wù)非常熟悉 Windows和Linux都是多任務(wù)的操作系統(tǒng) 這些操作系統(tǒng)可以同時運行兩個或兩個以上的程序 并且看起來這些程序似乎在同時運行 操作系統(tǒng)負責(zé)把系統(tǒng)資源分配給這些運行中的程序 并讓人感覺它們是并發(fā)活動的 線程的基本概念 實現(xiàn)多任務(wù)通常有兩種方法 一種稱為搶占式多任務(wù) preemptivemultitasking 一種叫合作式多任務(wù) cooperativemultitasking 對于搶占式多任務(wù) 操作系統(tǒng)自行決定何時中斷一個程序 將執(zhí)行時間分給其他程序 相反 對于合作式多任務(wù)操作系統(tǒng)將與程序進行協(xié)商 只有程序自愿放棄控制時才被中斷 多線程把操作系統(tǒng)的多任務(wù)原理應(yīng)用到程序中 進一步發(fā)展了這一原理 應(yīng)用了多線程技術(shù)的程序如同多任務(wù)操作系統(tǒng)一樣 可以同時執(zhí)行多個任務(wù) 每個任務(wù)被稱為一個線程 它是線程控制流的簡稱 Java語言本身也使用一個線程在后臺收集無用的內(nèi)存單元 這樣就減少了用戶管理內(nèi)存的麻煩 通常 把操作系統(tǒng)的多個任務(wù)稱為進程 Process 而程序中的多任務(wù)則稱為線程 線程和進程之間有什么區(qū)別 最基本的區(qū)別就是每個進程都擁有一組完整的屬于自己的變量 而線程則共享這些數(shù)據(jù) 和進程間的通信相比 線程間的通信要快得多 也方便得多 線程一個線程是給定的指令的序列 你所編寫的代碼 一個棧 在給定的方法中定義的變量 以及一些共享數(shù)據(jù) 類一級的變量 線程也可以從全局類中訪問靜態(tài)數(shù)據(jù) 創(chuàng)建線程在Java平臺中 創(chuàng)建一個線程非常簡單 最直接的方法就是從線程類java lang Thread繼承 在缺省情況下 線程類可以被所有的Java應(yīng)用程序調(diào)用 java lang Thread類中定義的五個方法 run 該方法用于線程的執(zhí)行 你需要重載該方法 以便讓線程做特定的工作 start 該方法使得線程啟動run 方法 stop 該方法同start 方法的作用相反 用于停止線程的運行 suspend 該方法同stop 方法不同的是 它并不終止未完成的線程 而只是掛起線程 以后還可恢復(fù) resume 該方法重新啟動已經(jīng)掛起的線程 實例 新創(chuàng)建的類重載了run 方法 但實現(xiàn)run 方法不必很嚴(yán)格 因為Thread類可提供一個缺省的run 方法 盡管它不是特別有用 其運行結(jié)果如下 ThreadArunningfor2iterationsThreadAsleepingfor913msbetweenloopsThreadA0ThreadBrunningfor12iterationsThreadBsleepingfor575msbetweenloopsThreadB0 ThreadCrunningfor4iterationsThreadCsleepingfor370msbetweenloopsThreadC0ThreadC1ThreadB1ThreadC2ThreadA1ThreadC3ThreadB2ThreadB3 ThreadB4ThreadB5ThreadB6ThreadB7ThreadB8ThreadB9ThreadB10ThreadB11 使用Runnable接口有時 不能重新定義父類 或者不能定義派生的線程類 但也許你的類的層次要求父類為特定的類 然而 Java語言是不支持多父類的 在這些情況下 可以通過Runnable接口來實現(xiàn)多線程的功能 Thread類本身也實現(xiàn)了Runnable接口 一個Runnable接口提供了一個publicvoidrun 方法 實例2 使用Runnable接口 需要實現(xiàn)run 方法 也需要創(chuàng)建Thread對象的一個實例 它最終是用來調(diào)用run 方法的 首先 main 方法構(gòu)造了Test類的一個實例r 實例r有它自己的數(shù)據(jù) 在這里就是整數(shù)i 因為實例r是傳給Thread的類構(gòu)造函數(shù)的 所以r的整數(shù)i就是線程運行時刻所操作的數(shù)據(jù) 一個多線程編程環(huán)境允許創(chuàng)建基于同一個Runnable實例的多個線程 這可以通過以下方法來做到 Threadt1 newThread r Threadt2 newThread r 此時 這兩個線程共享數(shù)據(jù)和代碼 使用Runnable的原因從面向?qū)ο蟮慕嵌葋砜?Thread類是一個虛擬處理機嚴(yán)格的封裝 因此只有當(dāng)處理機模型修改或擴展時 才應(yīng)該繼承類 由于Java技術(shù)只允許單一繼承 所以如果你已經(jīng)繼承了Thread 你就不能再繼承其他任何類 例如Applet 在某些情況下 這會使你只能采用實現(xiàn)Runnable的方法 線程有四種狀態(tài) 分別為 new 初始態(tài) 一個線程在調(diào)用new 方法之后 調(diào)用start 方法之前所處的狀態(tài) 在初始態(tài)中 可以調(diào)用start 和stop 方法 線程的屬性 Runnable 可運行狀態(tài) 一旦線程調(diào)用了start 方法 線程就轉(zhuǎn)到Runnable 狀態(tài) 注意 如果線程處于Runnable狀態(tài) 它也有可能不在運行 這是因為還存在優(yōu)先級和調(diào)度問題 blocked 阻塞 掛起狀態(tài) 線程處于阻塞狀態(tài) 這是由兩種可能性造成的 因掛起而暫停 由于某些原因而阻塞 例如等待IO請求的完成等 dead 終止?fàn)顟B(tài) 線程轉(zhuǎn)到退出狀態(tài) 這有兩種可能性 run 方法執(zhí)行結(jié)束 調(diào)用了stop 方法 所有可運行線程根據(jù)優(yōu)先級保存在池中 當(dāng)一個被阻塞的線程變成可運行時 它會被放回相應(yīng)的可運行池 優(yōu)先級最高的非空池中的線程會得到處理機時間 被運行 因為Java線程不一定是分時的 所有你必須確保你的代碼中的線程會不時地給另外一個線程運行的機會 這可以通過在各種時間間隔中發(fā)出sleep 調(diào)用來做到 Thread類的另一個方法yield 可以用來使具有相同優(yōu)先級的線程獲得執(zhí)行的機會 如果具有相同優(yōu)先級的其他線程是可運行的 yield 將把調(diào)用線程放到可運行池中并使另一個線程運行 如果沒有相同優(yōu)先級的可運行進程 yield 什么都不做 sleep 調(diào)用會給較低優(yōu)先級線程一個運行的機會 yield 方法只會給相同優(yōu)先級線程一個執(zhí)行的機會 線程的調(diào)度線程類提供了四種對線程進行操作的重要方法 sleep join wait 和notify sleep 方法是使線程停止一段時間的方法 在sleep時間間隔期滿后 線程不一定立即恢復(fù)執(zhí)行 這是因為在那個時刻 其他線程可能正在運行而且沒有被調(diào)度為放棄執(zhí)行 除非 a 醒來 的線程具有更高的優(yōu)先級 b 正在運行的線程因為其他原因而阻塞 join 方法使得一個線程等待另外一個線程結(jié)束后再執(zhí)行 例如 一個GUI 或者其他線程 使用join 方法等待一個子線程執(zhí)行完畢 CompleteCalcThreadt newCompleteCalcThread t start 做一會兒其他的事情 然后等待t join 使用計算結(jié)果 join 方法有三種格式 voidjoin 等待線程執(zhí)行完畢 voidjoin longtimeout 最多等待某段時間讓線程完成 voidjoin longmilliseconds intnanoseconds 最多等待某段時間 毫秒 納秒 讓線程完成 對于編寫線程的程序員來說 還有其他兩個有用的方法 即wait 和notify 使用這兩個API 可以精確地控制線程的執(zhí)行過程 關(guān)于這兩個方法的使用 將在后面詳細解釋 線程的優(yōu)先級線程可以設(shè)定優(yōu)先級 高優(yōu)先級的線程可以安排在低優(yōu)先級線程之前完成 一個應(yīng)用程序可以通過使用線程中的setPriority int 方法來設(shè)置線程的優(yōu)先級大小 Java中 線程的優(yōu)先級從低到高以整數(shù)1 10表示 共分為10級 設(shè)置優(yōu)先級是通過調(diào)用線程對象的setPriority 方法來進行的 設(shè)置優(yōu)先級的語句為Threadthreadone newThread 用Thread類的子類創(chuàng)建線程Threadthreadtwo newThread threadone setPriority 6

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論