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ù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

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

溫馨提示

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

評(píng)論

0/150

提交評(píng)論