java11(多線程)_第1頁(yè)
java11(多線程)_第2頁(yè)
java11(多線程)_第3頁(yè)
java11(多線程)_第4頁(yè)
java11(多線程)_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、多線程編程本章內(nèi)容o 線程與進(jìn)程o 創(chuàng)建多線程的方式o 線程的控制o 線程的同步與死鎖o 線程間的通信程序、進(jìn)程和線程o程序是計(jì)算機(jī)指令的集合,它以文件的形式存儲(chǔ)在磁盤上。o進(jìn)程:是一個(gè)程序在其自身的地址空間中的一次執(zhí)行活動(dòng)。o進(jìn)程是資源申請(qǐng)、調(diào)度和獨(dú)立運(yùn)行的單位,因此,它使用系統(tǒng)中的運(yùn)行資源;而程序不能申請(qǐng)系統(tǒng)資源,不能被系統(tǒng)調(diào)度,也不能作為獨(dú)立運(yùn)行的單位,因此,它不占用系統(tǒng)的運(yùn)行資源。o線程:是進(jìn)程中的一個(gè)單一的連續(xù)控制流程。一個(gè)進(jìn)程可以擁有多個(gè)線程。o線程又稱為輕量級(jí)進(jìn)程,它和進(jìn)程一樣擁有獨(dú)立的執(zhí)行控制,由操作系統(tǒng)負(fù)責(zé)調(diào)度,區(qū)別在于線程沒有獨(dú)立的存儲(chǔ)空間,而是和所屬進(jìn)程中的其它線程共享一

2、個(gè)存儲(chǔ)空間,這使得線程間的通信遠(yuǎn)較進(jìn)程簡(jiǎn)單。 單線程程序與多線程程序單線程程序多線程程序一個(gè)線程兩個(gè)線程Java對(duì)多線程的支持oJava運(yùn)行時(shí)系統(tǒng)實(shí)現(xiàn)了一個(gè)用于調(diào)度線程執(zhí)行的線程調(diào)度器,用于確定某一時(shí)刻由哪一個(gè)線程在CPU上運(yùn)行。o在java技術(shù)中,線程通常是搶占式的而不需要時(shí)間片分配進(jìn)程(分配給每個(gè)線程相等的CPU時(shí)間的進(jìn)程)。搶占式調(diào)度模型就是許多線程處于可以運(yùn)行狀態(tài)(等待狀態(tài)),但實(shí)際上只有一個(gè)線程在運(yùn)行。該線程一直運(yùn)行到它終止進(jìn)入可運(yùn)行狀態(tài)(等待狀態(tài)),或者另一個(gè)具有更高優(yōu)先級(jí)的線程變成可運(yùn)行狀態(tài)。在后一種情況下,低優(yōu)先級(jí)的線程被高優(yōu)先級(jí)的線程搶占,高優(yōu)先級(jí)的線程獲得運(yùn)行的機(jī)會(huì)。 oJ

3、ava線程調(diào)度器支持不同優(yōu)先級(jí)線程的搶先方式,但其本身不支持相同優(yōu)先級(jí)線程的時(shí)間片輪換。oJava運(yùn)行時(shí)系統(tǒng)所在的操作系統(tǒng)(例如:Windows2000)支持時(shí)間片的輪換,則線程調(diào)度器就支持相同優(yōu)先級(jí)線程的時(shí)間片輪換。Java對(duì)多線程的支持o Java在語言級(jí)提供了對(duì)多線程程序設(shè)計(jì)的支持。o 實(shí)現(xiàn)多線程程序的兩種方式: (1)繼承Thread類,并覆蓋run()方法; (2)實(shí)現(xiàn)Runnable接口。繼承Thread舉例class MyThread extends Threadpublic void run()int i=1000;while(i=0) System.out.println(i

4、); i-;繼承Thread舉例public static void main(String args) MyThread mTh=new MyThread();mTh.start();int i=1;while(i=0) System.out.println(i); i-;實(shí)現(xiàn)Runnable接口舉例public static void main(String args) MyRunnable runable=new MyRunnable();Thread mTh=new Thread(runable);mTh.start();int i=1;while(i=1000)System.out.

5、println(i); i+;線程的啟動(dòng)o 一個(gè)新創(chuàng)建的線程并不自動(dòng)開始運(yùn)行。你必須調(diào)用它的start()方法。例如:mTh.start();o 調(diào)用start()方法使線程所代表的虛擬處理機(jī)處于可運(yùn)行狀態(tài)(Runnable),這意味著它可以由JVM調(diào)度并執(zhí)行。但并不是說線程就會(huì)立即運(yùn)行。線程的控制o 獲取當(dāng)前線程:Thread.currentThread() 通過Thread類的靜態(tài)方法可以獲取當(dāng)前正在運(yùn)行的線程,其返回值是一個(gè)Thread對(duì)象,如獲取當(dāng)前線程的名字: String threadName= Thread.currentThread().getName(); 線程的名字可以在構(gòu)

6、造線程時(shí)手工設(shè)置。線程的控制o 當(dāng)一個(gè)線程結(jié)束運(yùn)行并終止時(shí),它就不能再運(yùn)行了。o 將一個(gè)線程變?yōu)槭刈o(hù)線程:setDaemon(true) 守護(hù)線程與其它線程的區(qū)別是,如果守護(hù)線程是唯一運(yùn)行著的線程,程序會(huì)自動(dòng)退出, 考慮一下前面的代碼,如果run()方法寫成一個(gè)循環(huán),那么在主線程執(zhí)行完畢后程序仍不能結(jié)束,JAVA的垃圾回收機(jī)置就是守護(hù)線程的一個(gè)典型應(yīng)用.線程的控制o 線程的休眠:sleep(time);o sleep()方法是一種可以使線程暫停執(zhí)行的機(jī)制,它可以使線程停止一段時(shí)間的執(zhí)行。在sleep時(shí)間間隔期滿后,線程不一定立即恢復(fù)執(zhí)行。這是因?yàn)樵谀莻€(gè)時(shí)刻,其它線程可能正在運(yùn)行而且沒有被調(diào)度為

7、放棄執(zhí)行線程的控制o 測(cè)試線程是否執(zhí)行完畢:isAlive()o 有時(shí)線程可處于一個(gè)未知的狀態(tài)。isAlive()方法用來確定一個(gè)線程是否仍是活的。活著的線程并不意味著線程正在運(yùn)行;對(duì)于一個(gè)已開始運(yùn)行但還沒有完成任務(wù)的線程,這個(gè)方法返回true。選擇合適的創(chuàng)建線程的方法o 在JAVA中實(shí)現(xiàn)多線程有兩種方法,具體使用那一種取決于你的應(yīng)用,通常情況下兩種方式都可以。但JAVA是單繼承的,這也就意味著如果你已經(jīng)繼承了一個(gè)其它的類,就不能再繼承Thread了,同時(shí)實(shí)現(xiàn)Runnable接口也特別適合多個(gè)線程處理同一資源的場(chǎng)合,如多個(gè)售票窗口同時(shí)賣票線程的狀態(tài)NewRunnableNot Runnable

8、Deadnew Threadstartsleep、wait、suspend、I/O阻塞sleep結(jié)束、notify、resume、IO操作完成run方法退出stop方法調(diào)用stop方法調(diào)用yield線程的同步o 當(dāng)兩個(gè)或兩個(gè)以上的線程需要共享資源,它們需要某種方法來確定資源在某一刻僅被一個(gè)線程占用。達(dá)到此目的的過程叫做同步(synchronization)o 同步的兩種方式:同步塊和同步方法o 每一個(gè)對(duì)象都有一個(gè)監(jiān)視器,或者叫做鎖。o 同步方法利用的是this所代表的對(duì)象的鎖。o 每個(gè)class也有一個(gè)鎖,是這個(gè)class所對(duì)應(yīng)的Class對(duì)象的鎖。線程的死鎖o 線程1鎖住了對(duì)象A的監(jiān)視器,等

9、待對(duì)象B的監(jiān)視器,線程2鎖住了對(duì)象B的監(jiān)視器,等待對(duì)象A的監(jiān)視器,就造成了死鎖。o 如果你的持有一個(gè)鎖并試圖獲取另一個(gè)鎖時(shí),就有死鎖的危險(xiǎn).線程線程2pen線程線程1note把把“pen”給我給我,我我才能給你才能給你“note”把把“note”給我給我,我我才能給你才能給你“pen”wait、notify、notifyAllo每一個(gè)對(duì)象除了有一個(gè)鎖之外,還有一個(gè)等待隊(duì)列(wait set),當(dāng)一個(gè)對(duì)象剛創(chuàng)建的時(shí)候,它的對(duì)待隊(duì)列是空的。o我們應(yīng)該在當(dāng)前線程鎖住對(duì)象的鎖后,去調(diào)用該對(duì)象的wait方法。o當(dāng)調(diào)用對(duì)象的notify方法時(shí),將從該對(duì)象的等待隊(duì)列中刪除一個(gè)任意選擇的線程,這個(gè)線程將再次成為可運(yùn)行的線程。o當(dāng)調(diào)用對(duì)象的notifyAll方法時(shí),將從該對(duì)象的等待隊(duì)列中刪除所有等待的線程,這些線程將成為可運(yùn)行的線程。owait和notify主要用于producer-consumer這種關(guān)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論