java課件-多線程_第1頁
java課件-多線程_第2頁
java課件-多線程_第3頁
java課件-多線程_第4頁
java課件-多線程_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、1多線程 第七章2本章內(nèi)容n 線程的概念模型線程的概念模型n 線程的創(chuàng)建和啟動線程的創(chuàng)建和啟動n 線程的狀態(tài)控制線程的狀態(tài)控制n 線程的同步線程的同步3什么是進(jìn)程n進(jìn)程就是一個在內(nèi)存中獨立運(yùn)行的程序,有自己的地址空間 。如正在運(yùn)行的寫字板程序就是一個進(jìn)程n“多任務(wù)”:指操作系統(tǒng)能同時運(yùn)行多個進(jìn)程(程序)。如WIN2K系統(tǒng)可以同時運(yùn)行寫字板程序、畫圖程序、WORD、EXCEL等4什么是線程n線程:是進(jìn)程內(nèi)部單一的一個順序控制流。n線程和進(jìn)程n每個進(jìn)程都有獨立的代碼和數(shù)據(jù)空間(進(jìn)程上下文),進(jìn)程切換的開銷大。n線程: 輕量的進(jìn)程,同一類線程共享代碼和數(shù)據(jù)空間,每個線程有獨立的運(yùn)行棧和程序計數(shù)器(P

2、C),線程切換的開銷小。n多線程: 在同一個進(jìn)程中有多個順序流同時執(zhí)行5線程的概念模型n 虛擬的CPU,由java.lang.Thread類封裝和虛擬n CPU所執(zhí)行的代碼,傳遞給Thread類對象。n CPU所處理的數(shù)據(jù),傳遞給Thread類對象。代 碼數(shù) 據(jù)虛擬CPUJava線程模型6線程體nJava的線程是通過java.lang.Thread類來實現(xiàn)的。n每個線程都是通過某個特定Thread對象所對應(yīng)的方法run( )來完成其操作的,方法run( )稱為線程體(即線程的可執(zhí)行代碼)。7多線程文件文件輸入輸出裝置輸入輸出裝置各種系統(tǒng)資源各種系統(tǒng)資源數(shù)據(jù)區(qū)段數(shù)據(jù)區(qū)段程序區(qū)段程序區(qū)段只有一個地

3、方在執(zhí)行只有一個地方在執(zhí)行文件文件輸入輸出裝置輸入輸出裝置各種系統(tǒng)資源各種系統(tǒng)資源數(shù)據(jù)區(qū)段數(shù)據(jù)區(qū)段程序區(qū)段程序區(qū)段同時有數(shù)個地方在執(zhí)行同時有數(shù)個地方在執(zhí)行傳統(tǒng)的進(jìn)程傳統(tǒng)的進(jìn)程多線程的任務(wù)多線程的任務(wù)8主線程n在任何Java程序啟動時,一個線程立刻運(yùn)行(即main方法對應(yīng)的線程),該線程通常稱為程序的主線程。n主線程的特點: n它是產(chǎn)生其他子線程的線程。n它不一定是最后完成執(zhí)行的線程,子線程可能在它結(jié)束之后還在運(yùn)行。9創(chuàng)建線程n有兩種方法用來創(chuàng)建線程:n聲明一個 Thread 類的子類,并覆蓋 run() 方法。 n class mythread extends Thread n public

4、void run( ) /* 覆蓋該方法*/ n n聲明一個實現(xiàn) Runnable 接口的類,并實現(xiàn) run() 方法。 nclass mythread implements Runnablen public void run( ) /* 實現(xiàn)該方法*/ n n用start()方法啟動線程:nThread t1 = new Thread();1.T1.start();10java.lang.Thread類n這個類包含了創(chuàng)建和運(yùn)行線程所需的一切東西n構(gòu)造函數(shù):npublic Thread();npublic Thread(Runnable target);npublic Thread(Strin

5、g name);n參數(shù)說明:nname:新線程對象的名字11java.lang.Thread類 2-1n常用方法:npublic void start();/啟動該線程,將導(dǎo)致run方法被自動調(diào)用。該方法將立即返回,新線程將運(yùn)行npublic void run();/必須覆蓋該方法,在方法體中添加你想要在該線程中執(zhí)行的代碼npublic static void sleep(long millis) throws InterruptedException;/使當(dāng)前正在執(zhí)行的線程睡眠指定的時間npublic void interrupt();/用于將一個中斷請求發(fā)送給線程npublic stati

6、c boolean interrupted();/用于測試當(dāng)前線程(即正在執(zhí)行該指令的線程)是否已經(jīng)被中斷npublic boolean isInterrupted();/用于測試某個線程是否已經(jīng)被中斷npublic final boolean isAlive();/用于測試某個線程是否還活著npublic final void setPriority(int newPriority);/設(shè)置線程的優(yōu)先級12java.lang.Thread類 2-2npublic final void join(long millis) throws InterruptedException;/使某個線程等待

7、指定的時間。調(diào)用某線程的該方法,將當(dāng)前線程與該線程“合并”,即等待該線程結(jié)束,再恢復(fù)當(dāng)前線程的運(yùn)行。npublic final int getPriority() ; /獲得線程的優(yōu)先級npublic static Thread currentThread();返回代表當(dāng)前正在執(zhí)行的線程的Thread對象npublic static void yield() ;使當(dāng)前正在執(zhí)行的線程臨時暫停,以使其它的線程運(yùn)行npublic final void wait(long timeout) throws InterruptedException;當(dāng)前線程被中斷,并進(jìn)入到一個對象的等待列表中,直到另外的

8、線程調(diào)用同一個對象上的notify() 或notifyAll() 方法npublic final void notify() ;用于將對象等待列表中的任選的一個線程喚醒,使它再次成為可運(yùn)行的線程npublic final void notifyAll();用于將對象等待列表中的所有線程喚醒,使它們再次成為可運(yùn)行的線程13java.lang.Runnable接口n該接口只有一個方法:npublic void run() ;n實現(xiàn)該接口的類必須覆蓋該方法。n實現(xiàn)了Runnable接口的類并不具有任何天生的線程處理能力,這與那些從Thread類繼承的類是不同的。n為了從一個Runnable對象產(chǎn)生線

9、程,必須再單獨創(chuàng)建一個線程對象,并把Runnable對象傳遞給它。14兩種創(chuàng)建線程方法的比較n使用Runnable接口n 可以將代碼和數(shù)據(jù)分開,形成清晰的模型;n還可以從其他類繼承;n保持程序風(fēng)格的一致性。n直接繼承Thread類n不能再從其他類繼承;n編寫簡單,可以直接操縱線程,無需使用 Thread. currentThread()。15創(chuàng)建多線程public class TestThread /主類public static void main(String args) Runner r = new Runner();/生成線程類對象rThread t1 = new Thread(r);

10、/創(chuàng)建線程對象t1Thread t2 = new Thread(r);/創(chuàng)建線程對象t2t1.start();/啟動線程t1t2.start();/啟動線程t2class Runner implements Runnable /線程類public void run() for(int i=0; i20; i+) System. out. println(No. + i);16多線程共享數(shù)據(jù)和代碼線程虛擬CPU代 碼數(shù) 據(jù)t1Thread類對象t1Runner類中的run方法Runner類型對象rt2Thread類對象t2Runner類中的run方法Runner類型對象rn 對上例進(jìn)行分析,可以

11、得到下表:對上例進(jìn)行分析,可以得到下表:17join方法使用示例public class TestThread5 public static void main(String args)Runner5 r = new Runner5(); Thread t = new Thread(r); t.start(); try t.join();/主線程主線程main將中斷,直到線程將中斷,直到線程t執(zhí)行完畢執(zhí)行完畢 catch(InterruptedException e) for(int i=0;i50;i+) System.out.println(主線程: + i); class Runner5

12、 implements Runnable public void run() for(int i=0;i10;i+) System.out.println(SubThread: + i);18線程的優(yōu)先級n在java中,每一個線程都有一個優(yōu)先級。默認(rèn)情況下,一個線程將繼承其父線程的優(yōu)先級。線程的優(yōu)先級用數(shù)字來表示,范圍從1到10,一個線程的缺省優(yōu)先級是5 Thread.MIN_PRIORITY = 1Thread.MAX_PRIORITY = 10Thread.NORM_PRIORITY = 5n使用下述線方法獲得或設(shè)置線程對象的優(yōu)先級int getPriority();void setPri

13、ority(int newPriority);19數(shù)據(jù)的完整性n在大多數(shù)實際運(yùn)行的多線程應(yīng)用程序中,兩個或多個線程需要共享對同一個對象的訪問。如果兩個線程訪問同一個對象,并且每個線程都調(diào)用一個方法修改該對象的狀態(tài),會出現(xiàn)什么情況?n由于多個線程運(yùn)行時執(zhí)行順序是交叉的,根據(jù)數(shù)據(jù)被訪問的順序,將會產(chǎn)生受損壞的對象。這種情況通常稱為爭用條件(race condition)線程1線程2線程10對象變量取過來加1后送回去對象狀態(tài)和想象的不一樣啊,咋整?!20對象的監(jiān)視器(鎖)n在java中,每個對象都包含了一把鎖(也叫作“監(jiān)視器”),它自動成為對象的一部分(不必為此寫任何特殊的代碼)。在給定時刻,只有一

14、個線程可以擁有一個對象的鎖n示例:線程1進(jìn)入withdrawal方法時,獲得監(jiān)視器(加鎖);當(dāng)線程1的方法執(zhí)行完畢返回時,釋放監(jiān)視器(開鎖),線程2的withdrawal方能進(jìn)入withdrawal()線程線程1監(jiān)視器監(jiān)視器線程線程221同步(synchronized)n為了確保在任何時刻一個共享對象只被一個線程使用,必須使用“同步(synchronized)”n有兩種方式實現(xiàn)同步:使用同步方法synchronized void methodA() 使用同步塊synchronized(obj)/obj是被鎖定的對象/要同步的語句n用synchronized來標(biāo)識的塊或方法即為監(jiān)視器監(jiān)視的部分。

15、只有使用synchronized ,才能利用對象的監(jiān)視器功能。22wait-notify 機(jī)制n當(dāng)synchronized方法中的wait方法被調(diào)用時,當(dāng)前線程將被中斷運(yùn)行,并且放棄該對象的鎖。n一旦線程調(diào)用了wait方法,它便進(jìn)入該對象的等待列表。要從等待列表中刪除該線程,使它有機(jī)會繼續(xù)運(yùn)行,其它線程必須調(diào)用同一個對象上的notify或者notifyAll方法。n當(dāng)線程再次成為可運(yùn)行的線程后,它們便試圖重新進(jìn)入該對象。一旦可以使用該對象鎖時,其中的一個線程將鎖定該對象,并且從它上次調(diào)用wait方法后的位置開始繼續(xù)運(yùn)行23使用同步機(jī)制l如果兩個或多個線程修改一個對象,請將執(zhí)行修改的方法聲明為s

16、ynchronized方法。受到對象修改影響的只讀方法也必須實現(xiàn)同步l不要在synchronized方法中花費大量的時間。大多數(shù)操作只是更新數(shù)據(jù),然后很快返回24l每當(dāng)一個方法改變某個對象的狀態(tài)時,它就應(yīng)該調(diào)用notifyAll方法。這樣可以給等待線程一個機(jī)會,以便查看環(huán)境有沒有發(fā)生變化l記住,wait和notifyAll/notify方法都屬于Object類的方法,而不是Thread類的方法。反復(fù)檢查你對wait方法的調(diào)用與同一對象上的通知是否匹配25死鎖n當(dāng)所有的線程都在等待得到某個資源后才能繼續(xù)運(yùn)行下去時,整個程序?qū)⒈粧炱穑@種情況就叫做死鎖n圖例:線程線程2pen線程線程1note把把“pen”給我給我,我我才能給你才能給你“note”把把“note”給我給我,我我才能給你才能給你“pen”26wait-notify使用示例n信息板例子。read()方法在讀信息之前先等待,直到信息可讀,讀完后通知要寫的線程。write()方法在寫信息之前先等待,直到信息被取走

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論