[計(jì)算機(jī)軟件及應(yīng)用]多線程程序設(shè)計(jì)ppt課件_第1頁
[計(jì)算機(jī)軟件及應(yīng)用]多線程程序設(shè)計(jì)ppt課件_第2頁
[計(jì)算機(jī)軟件及應(yīng)用]多線程程序設(shè)計(jì)ppt課件_第3頁
[計(jì)算機(jī)軟件及應(yīng)用]多線程程序設(shè)計(jì)ppt課件_第4頁
[計(jì)算機(jī)軟件及應(yīng)用]多線程程序設(shè)計(jì)ppt課件_第5頁
已閱讀5頁,還剩54頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、12想象一下,假如我們想要從想象一下,假如我們想要從InternetInternet上下載一上下載一段很長的視頻或者音頻片段,假如我們可以把段很長的視頻或者音頻片段,假如我們可以把下載任務(wù)放在一個(gè)獨(dú)立的線程里實(shí)現(xiàn),我們在下載任務(wù)放在一個(gè)獨(dú)立的線程里實(shí)現(xiàn),我們在下載開場之后很快就可以觀看這個(gè)片段了,而下載開場之后很快就可以觀看這個(gè)片段了,而不是必須等全部下載完成才可以觀看。不是必須等全部下載完成才可以觀看。此外,多線程的執(zhí)行還可以允許許多用戶同時(shí)此外,多線程的執(zhí)行還可以允許許多用戶同時(shí)訪問一個(gè)公共的數(shù)據(jù)庫,這個(gè)特性對于類似庫訪問一個(gè)公共的數(shù)據(jù)庫,這個(gè)特性對于

2、類似庫存管理和機(jī)票預(yù)定這樣的系統(tǒng)有時(shí)候顯得非常存管理和機(jī)票預(yù)定這樣的系統(tǒng)有時(shí)候顯得非常有用。有用。為了防止由于多個(gè)用戶同時(shí)讀取和寫入公共數(shù)為了防止由于多個(gè)用戶同時(shí)讀取和寫入公共數(shù)據(jù)庫而造成的數(shù)據(jù)破壞,多線程還需要在對象據(jù)庫而造成的數(shù)據(jù)破壞,多線程還需要在對象上設(shè)置鎖。這樣一個(gè)時(shí)刻只有一個(gè)線程可以修上設(shè)置鎖。這樣一個(gè)時(shí)刻只有一個(gè)線程可以修改一個(gè)對象的狀態(tài)。改一個(gè)對象的狀態(tài)。 3如何理論對正在下載的視頻進(jìn)展同時(shí)觀看;機(jī)票預(yù)訂;并發(fā)的處理。4線程的概念線程的概念線程的調(diào)度線程的調(diào)度創(chuàng)立和啟動線程創(chuàng)立和啟動線程ThreadThread線程類、線程類、RunnableRunnable接口接口多個(gè)線程的同

3、步多個(gè)線程的同步線程之間的通信線程之間的通信5程序:程序:是一段靜態(tài)的代碼,它是應(yīng)用程序執(zhí)行的藍(lán)本。是一段靜態(tài)的代碼,它是應(yīng)用程序執(zhí)行的藍(lán)本。進(jìn)程:進(jìn)程:是程序的一次動態(tài)執(zhí)行過程,它對應(yīng)了從代碼加是程序的一次動態(tài)執(zhí)行過程,它對應(yīng)了從代碼加載、執(zhí)行到執(zhí)行完畢的一個(gè)完好過程,也是進(jìn)程本身從載、執(zhí)行到執(zhí)行完畢的一個(gè)完好過程,也是進(jìn)程本身從產(chǎn)生、開展至消亡的過程。產(chǎn)生、開展至消亡的過程。目前所流行的操作系統(tǒng)中,大部分都是支持多任務(wù)的目前所流行的操作系統(tǒng)中,大部分都是支持多任務(wù)的如如Windows 3.XWindows 3.X,Windows NTWindows NT,Windows 95Windows

4、 95,OS/2OS/2及及UNIXUNIX的的各個(gè)版本各個(gè)版本,這實(shí)際就是一種,這實(shí)際就是一種多進(jìn)程多進(jìn)程的概念的概念每一個(gè)任每一個(gè)任務(wù)就是一個(gè)務(wù)就是一個(gè)。線程:線程:比進(jìn)程更小的執(zhí)行單位。比進(jìn)程更小的執(zhí)行單位。一個(gè)進(jìn)程在執(zhí)行過程中,一個(gè)進(jìn)程在執(zhí)行過程中,為了同時(shí)完成多項(xiàng)操作,可以產(chǎn)生多個(gè)線程,形成多條為了同時(shí)完成多項(xiàng)操作,可以產(chǎn)生多個(gè)線程,形成多條執(zhí)行線索。每個(gè)線程都有它自身的產(chǎn)生、存在和消亡的執(zhí)行線索。每個(gè)線程都有它自身的產(chǎn)生、存在和消亡的過程。過程。6多進(jìn)程多進(jìn)程環(huán)境中每一個(gè)進(jìn)程既包括其所要執(zhí)行的指環(huán)境中每一個(gè)進(jìn)程既包括其所要執(zhí)行的指令令, , 也包括執(zhí)行指令所需的任何系統(tǒng)資源也包括執(zhí)

5、行指令所需的任何系統(tǒng)資源, , 如如CPUCPU、內(nèi)存空間、內(nèi)存空間、I/OI/O端口等端口等, ,不同進(jìn)程所占用的系統(tǒng)資不同進(jìn)程所占用的系統(tǒng)資源相對獨(dú)立;源相對獨(dú)立;線程是比進(jìn)程單位更小的執(zhí)行單位,多線程環(huán)境線程是比進(jìn)程單位更小的執(zhí)行單位,多線程環(huán)境中每一個(gè)線程都隸屬于某一進(jìn)程中每一個(gè)線程都隸屬于某一進(jìn)程, ,由進(jìn)程觸發(fā)執(zhí)行由進(jìn)程觸發(fā)執(zhí)行, ,在系統(tǒng)資源的使用上在系統(tǒng)資源的使用上, ,屬于同一進(jìn)程的所有線程共屬于同一進(jìn)程的所有線程共享該進(jìn)程的系統(tǒng)資源;享該進(jìn)程的系統(tǒng)資源;與進(jìn)程不同的是線程本身即沒有入口,也沒有與進(jìn)程不同的是線程本身即沒有入口,也沒有出口,其自身也不能獨(dú)立運(yùn)行,它棲身于某個(gè)出

6、口,其自身也不能獨(dú)立運(yùn)行,它棲身于某個(gè)進(jìn)程之中,由進(jìn)程啟動運(yùn)行,完成其任務(wù)后,進(jìn)程之中,由進(jìn)程啟動運(yùn)行,完成其任務(wù)后,自動終止,也可以由進(jìn)程使之強(qiáng)迫終止。自動終止,也可以由進(jìn)程使之強(qiáng)迫終止。7多線程程序設(shè)計(jì):多線程程序設(shè)計(jì):是指單個(gè)程序包含是指單個(gè)程序包含的多個(gè)線程。當(dāng)多的多個(gè)線程。當(dāng)多線程程序執(zhí)行時(shí),該程序?qū)?yīng)的進(jìn)程中就有多線程程序執(zhí)行時(shí),該程序?qū)?yīng)的進(jìn)程中就有多個(gè)控制流在同時(shí)執(zhí)行,個(gè)控制流在同時(shí)執(zhí)行,即具有并發(fā)執(zhí)行的多個(gè)即具有并發(fā)執(zhí)行的多個(gè)線程;線程;例如:例如:PV操作操作Web Server承受客戶端的懇求問題承受客戶端的懇求問題銀行問題銀行問題網(wǎng)絡(luò)聊天網(wǎng)絡(luò)聊天一對多一對多程序程序8一

7、個(gè)多線程的例子一個(gè)多線程的例子:Test.javaTest.java此程序創(chuàng)立兩個(gè)線程,分別執(zhí)行存取款操作,并規(guī)定此程序創(chuàng)立兩個(gè)線程,分別執(zhí)行存取款操作,并規(guī)定每次存款每次存款2500025000元,每次取款元,每次取款5000050000元。元。9進(jìn)程、線程示意圖進(jìn)程、線程示意圖 10由于線程在程序內(nèi)部,多個(gè)線程共享一些系統(tǒng)的開銷,由于線程在程序內(nèi)部,多個(gè)線程共享一些系統(tǒng)的開銷,而而線程本身的數(shù)據(jù)通常只有微處理器的存放器數(shù)據(jù),以及一線程本身的數(shù)據(jù)通常只有微處理器的存放器數(shù)據(jù),以及一個(gè)供程序執(zhí)行時(shí)使用的堆棧。個(gè)供程序執(zhí)行時(shí)使用的堆棧。 例如線程之間共享一樣的內(nèi)例如線程之間共享一樣的內(nèi)存單元存單

8、元代碼和數(shù)據(jù)代碼和數(shù)據(jù),因此在線程間切換,不需要很大,因此在線程間切換,不需要很大的系統(tǒng)開銷,的系統(tǒng)開銷,所以線程之間的切換速度遠(yuǎn)遠(yuǎn)比進(jìn)程之間快,所以線程之間的切換速度遠(yuǎn)遠(yuǎn)比進(jìn)程之間快,線程之間的通信也比進(jìn)程通信快的多。線程之間的通信也比進(jìn)程通信快的多。多個(gè)線程輪流搶占多個(gè)線程輪流搶占CPUCPU資源而運(yùn)行時(shí),資源而運(yùn)行時(shí),從從微觀微觀上講,一個(gè)時(shí)上講,一個(gè)時(shí)間里只能有一個(gè)作業(yè)被執(zhí)行,在間里只能有一個(gè)作業(yè)被執(zhí)行,在宏觀宏觀上可使多個(gè)作業(yè)被同上可使多個(gè)作業(yè)被同時(shí)執(zhí)行,即等同于要讓多臺計(jì)算機(jī)同時(shí)工作,時(shí)執(zhí)行,即等同于要讓多臺計(jì)算機(jī)同時(shí)工作,使系統(tǒng)資源使系統(tǒng)資源特別是特別是CPUCPU的利用率得到進(jìn)

9、步,從而可以進(jìn)步整個(gè)程序的執(zhí)的利用率得到進(jìn)步,從而可以進(jìn)步整個(gè)程序的執(zhí)行效率。行效率。11Virtual CPUCodeDataThread txyz rclass xyz線程線程12 每一個(gè)進(jìn)程就是一個(gè)應(yīng)用程序。有自己的入口和出口。每一個(gè)進(jìn)程就是一個(gè)應(yīng)用程序。有自己的入口和出口。 多進(jìn)程多進(jìn)程環(huán)境中每一個(gè)進(jìn)程既包括其所要執(zhí)行的指令環(huán)境中每一個(gè)進(jìn)程既包括其所要執(zhí)行的指令, , 也包括也包括了執(zhí)行指令所需的任何系統(tǒng)資源了執(zhí)行指令所需的任何系統(tǒng)資源, , 如如CPUCPU、內(nèi)存空間、內(nèi)存空間、I/OI/O端端口等;口等; 不同進(jìn)程所占用的系統(tǒng)資源相對獨(dú)立。不同進(jìn)程所占用的系統(tǒng)資源相對獨(dú)立。 多個(gè)線

10、程可共同存在于一個(gè)應(yīng)用程序中。多個(gè)線程可共同存在于一個(gè)應(yīng)用程序中。 多線程多線程環(huán)境中每一個(gè)線程都環(huán)境中每一個(gè)線程都隸屬于某一進(jìn)程隸屬于某一進(jìn)程, ,由進(jìn)程觸發(fā)執(zhí)由進(jìn)程觸發(fā)執(zhí)行沒有自己的入口和出口;行沒有自己的入口和出口; 在系統(tǒng)資源的使用上在系統(tǒng)資源的使用上, ,屬于同一進(jìn)程的所有線程共享該進(jìn)程屬于同一進(jìn)程的所有線程共享該進(jìn)程的系統(tǒng)資源。的系統(tǒng)資源。線程之間切換的速度比進(jìn)程切換要快得多線程之間切換的速度比進(jìn)程切換要快得多。進(jìn)程和線程的比較總結(jié)進(jìn)程和線程的比較總結(jié)13線程的調(diào)度線程的調(diào)度1 1微觀上,在一臺只具有一個(gè)微觀上,在一臺只具有一個(gè)CPUCPU的機(jī)器上,的機(jī)器上,CPUCPU在同一在同

11、一時(shí)間只能分配給一個(gè)線程做一件事。時(shí)間只能分配給一個(gè)線程做一件事。當(dāng)有多于一個(gè)的線程工作時(shí),在當(dāng)有多于一個(gè)的線程工作時(shí),在JavaJava中,線程調(diào)度通中,線程調(diào)度通常是常是,。一旦一個(gè)線程獲得執(zhí)行權(quán),這個(gè)線程將持續(xù)運(yùn)行下去,一旦一個(gè)線程獲得執(zhí)行權(quán),這個(gè)線程將持續(xù)運(yùn)行下去,直到它運(yùn)行完畢或因?yàn)槟撤N原因此阻塞,或者有另一直到它運(yùn)行完畢或因?yàn)槟撤N原因此阻塞,或者有另一個(gè)高優(yōu)先級線程就緒個(gè)高優(yōu)先級線程就緒。14線程的調(diào)度線程的調(diào)度2 2所有被阻塞的線程按次序排列,組成一個(gè)阻塞隊(duì)列。例所有被阻塞的線程按次序排列,組成一個(gè)阻塞隊(duì)列。例如如: :因?yàn)樾枰却粋€(gè)較慢的外部設(shè)備,例如磁盤或用戶。因?yàn)樾枰却?/p>

12、一個(gè)較慢的外部設(shè)備,例如磁盤或用戶。讓處于運(yùn)行狀態(tài)的線程調(diào)用讓處于運(yùn)行狀態(tài)的線程調(diào)用Thread.sleepThread.sleep方法。方法。讓處于運(yùn)行狀態(tài)的線程調(diào)用另一個(gè)線程的讓處于運(yùn)行狀態(tài)的線程調(diào)用另一個(gè)線程的joinjoin方方法。法。所有就緒但沒有運(yùn)行的線程那么根據(jù)其優(yōu)先級排入一個(gè)所有就緒但沒有運(yùn)行的線程那么根據(jù)其優(yōu)先級排入一個(gè)就緒隊(duì)列。就緒隊(duì)列。當(dāng)當(dāng)CPUCPU空閑時(shí),假如就緒隊(duì)列不空,就緒隊(duì)列中第一個(gè)具空閑時(shí),假如就緒隊(duì)列不空,就緒隊(duì)列中第一個(gè)具有最高優(yōu)先級的線程將運(yùn)行。有最高優(yōu)先級的線程將運(yùn)行。當(dāng)一個(gè)線程被搶占而停頓運(yùn)行時(shí),它的運(yùn)行態(tài)被改變并當(dāng)一個(gè)線程被搶占而停頓運(yùn)行時(shí),它的運(yùn)

13、行態(tài)被改變并放到就緒隊(duì)列的隊(duì)尾;放到就緒隊(duì)列的隊(duì)尾;一個(gè)被阻塞可能因?yàn)樗呋虻却粋€(gè)被阻塞可能因?yàn)樗呋虻却齀/OI/O設(shè)備的線程就緒設(shè)備的線程就緒后通常也放到就緒隊(duì)列的隊(duì)尾。后通常也放到就緒隊(duì)列的隊(duì)尾。15線程的調(diào)度是按:線程的調(diào)度是按:其優(yōu)先級的上下順序執(zhí)行的;其優(yōu)先級的上下順序執(zhí)行的;同樣優(yōu)先級的線程遵循同樣優(yōu)先級的線程遵循“先到先執(zhí)行的原那么;先到先執(zhí)行的原那么;線程優(yōu)先級線程優(yōu)先級:范圍:范圍 110 110 10 10 級。數(shù)值越大,級別越高級。數(shù)值越大,級別越高Thread Thread 類定義的類定義的 3 3 個(gè)常數(shù):個(gè)常數(shù):MIN_PRIORITY MIN_PRIORITY

14、 最低最低小小優(yōu)先級值為優(yōu)先級值為1 1MAX_PRIORITY MAX_PRIORITY 最高最高大大優(yōu)先級值為優(yōu)先級值為1010NORM_PRIORITY NORM_PRIORITY 默認(rèn)優(yōu)先級值為默認(rèn)優(yōu)先級值為5 5線程創(chuàng)立時(shí),繼承父線程的優(yōu)先級。線程創(chuàng)立時(shí),繼承父線程的優(yōu)先級。常用方法:常用方法:getPrioritygetPriority :獲得線程的優(yōu)先級:獲得線程的優(yōu)先級setPrioritysetPriority :設(shè)置線程的優(yōu)先級:設(shè)置線程的優(yōu)先級1.1.ThreadPri.javaThreadPri.java1617主線程主線程主線程主線程:mainmain 方法方法App

15、lication Application 應(yīng)用程序應(yīng)用程序每當(dāng)用每當(dāng)用javajava命令啟動一個(gè)命令啟動一個(gè)JavaJava虛擬機(jī)進(jìn)程虛擬機(jī)進(jìn)程 Application Application 應(yīng)用程序,應(yīng)用程序,JavaJava虛擬機(jī)就會虛擬機(jī)就會創(chuàng)立一個(gè)主線程,該線程從程序入口創(chuàng)立一個(gè)主線程,該線程從程序入口mainmain方方法開場執(zhí)行。法開場執(zhí)行。閱讀器中加載的閱讀器中加載的 Applet Applet 主類主類Applet Applet 小程序小程序多線程多線程:在主線程中創(chuàng)立在主線程中創(chuàng)立 Thread Thread 類或其子類類或其子類對象時(shí),就創(chuàng)立了一個(gè)線程對象。對象時(shí),就創(chuàng)

16、立了一個(gè)線程對象。ProgrammerProgrammer可以控制線程的啟動、掛起與終止??梢钥刂凭€程的啟動、掛起與終止。18public class Sample public void method1String str System.out.printlnstr; public void method2String str method1str; public static void mainString args Sample s=new Sample; s.method2hello; main()方法方法method1()方法方法method2()方法方法主線程的方法調(diào)用棧主線程的方

17、法調(diào)用棧當(dāng)我們運(yùn)行java Sample命令時(shí),java虛擬時(shí)機(jī)給每個(gè)線程分配方方法調(diào)用棧,用于跟蹤每個(gè)線程調(diào)用方法的信息,同時(shí)方法調(diào)用棧法調(diào)用棧,用于跟蹤每個(gè)線程調(diào)用方法的信息,同時(shí)方法調(diào)用棧還用做線程的工作區(qū),方法部分變量會存放到方法調(diào)用棧中還用做線程的工作區(qū),方法部分變量會存放到方法調(diào)用棧中19在一個(gè)多線程運(yùn)行環(huán)境中運(yùn)行的線程可以有多種狀態(tài)在一個(gè)多線程運(yùn)行環(huán)境中運(yùn)行的線程可以有多種狀態(tài), ,也也就是說一個(gè)線程在不同時(shí)刻會處于以下狀態(tài)之一就是說一個(gè)線程在不同時(shí)刻會處于以下狀態(tài)之一: :新建、就緒、運(yùn)行、阻塞、終止;新建、就緒、運(yùn)行、阻塞、終止; BlockedBlocked終止終止新生成新

18、生成一個(gè)線程一個(gè)線程RunnableRunnableRunningRunningstart()start()yield()yield()notify()notify()wait(),sleep(),join()wait(),sleep(),join()20新建新建:當(dāng)一個(gè):當(dāng)一個(gè) Thread Thread 類或其子類對象被創(chuàng)立時(shí),新類或其子類對象被創(chuàng)立時(shí),新產(chǎn)生的線程處于新建狀態(tài),此時(shí)它已經(jīng)有了相應(yīng)的內(nèi)產(chǎn)生的線程處于新建狀態(tài),此時(shí)它已經(jīng)有了相應(yīng)的內(nèi)存空間和其他資源。如:存空間和其他資源。如: Thread myThread=new Thread myThread=new MyThreadCl

19、assMyThreadClass ; ;就緒就緒:調(diào)用:調(diào)用 startstart 方法來啟動處于新建狀態(tài)的方法來啟動處于新建狀態(tài)的線程后,將進(jìn)入線程隊(duì)列排隊(duì)等待線程后,將進(jìn)入線程隊(duì)列排隊(duì)等待 CPU CPU 效勞,此時(shí)它效勞,此時(shí)它已經(jīng)具備了運(yùn)行的條件,已經(jīng)具備了運(yùn)行的條件,一旦輪到它來享用一旦輪到它來享用 CPU CPU 資源資源時(shí),就可以脫離創(chuàng)立它的主線程,開場自己的生命周時(shí),就可以脫離創(chuàng)立它的主線程,開場自己的生命周期。期。運(yùn)行運(yùn)行:當(dāng)就緒狀態(tài)的線程被調(diào)度并獲得處理器資源時(shí),:當(dāng)就緒狀態(tài)的線程被調(diào)度并獲得處理器資源時(shí),便進(jìn)入運(yùn)行狀態(tài)。便進(jìn)入運(yùn)行狀態(tài)。每一個(gè)每一個(gè) Thread Thre

20、ad 類及其子類的對象類及其子類的對象都有一個(gè)重要的都有一個(gè)重要的 runrun 方法,當(dāng)線程對象被調(diào)用方法,當(dāng)線程對象被調(diào)用執(zhí)行時(shí),它將自動調(diào)用本對象的執(zhí)行時(shí),它將自動調(diào)用本對象的 runrun 方法,從方法,從第一句開場順序執(zhí)行。第一句開場順序執(zhí)行。RunRun 方法定義了這個(gè)線程方法定義了這個(gè)線程的操作和功能。的操作和功能。21阻塞:一個(gè)正在執(zhí)行的線程暫停自己的執(zhí)行而進(jìn)入的阻塞:一個(gè)正在執(zhí)行的線程暫停自己的執(zhí)行而進(jìn)入的狀態(tài)。狀態(tài)。引起線程由運(yùn)行狀態(tài)進(jìn)入阻塞狀態(tài)的可能情況:引起線程由運(yùn)行狀態(tài)進(jìn)入阻塞狀態(tài)的可能情況:該線程正在等待該線程正在等待 I/O I/O 操作的完成操作的完成調(diào)用了該線

21、程的調(diào)用了該線程的 sleepsleep 方法方法調(diào)用了調(diào)用了 waitwait 方法方法讓處于運(yùn)行狀態(tài)的線程調(diào)用另一個(gè)線程的讓處于運(yùn)行狀態(tài)的線程調(diào)用另一個(gè)線程的joinjoin方法方法22對應(yīng)于不同進(jìn)入阻塞狀態(tài)的情況,采取不同的方對應(yīng)于不同進(jìn)入阻塞狀態(tài)的情況,采取不同的方法使其回到就緒狀態(tài):法使其回到就緒狀態(tài):I/O I/O 操作:等待這個(gè)操作:等待這個(gè) I/O I/O 操作完成后;操作完成后;sleepsleep 方法:等待其指定的休眠事件完畢方法:等待其指定的休眠事件完畢后,自動脫離阻塞狀態(tài);后,自動脫離阻塞狀態(tài);調(diào)用調(diào)用 waitwait 方法:調(diào)用方法:調(diào)用 notifynotify

22、 或或 notifyAllnotifyAll 方法;方法;23終止:終止:自然終止:自然終止:線程完成了自己的全部工作線程完成了自己的全部工作強(qiáng)迫終止:強(qiáng)迫終止:在線程執(zhí)行完之前,調(diào)用在線程執(zhí)行完之前,調(diào)用 stopstop 或或 destroydestroy 方法終止線程方法終止線程24創(chuàng)建狀態(tài)創(chuàng)建狀態(tài)可運(yùn)行狀態(tài)可運(yùn)行狀態(tài)阻塞狀態(tài)阻塞狀態(tài)終止?fàn)顟B(tài)終止?fàn)顟B(tài)Start()Run()結(jié)束結(jié)束Stop()Stop()I/O受阻受阻Suspend()Wait()Sleep()Sleep()結(jié)束結(jié)束Notify()Resume()I/O完成完成Xueping Shen25JavaJava中的多線程是建立

23、在中的多線程是建立在ThreadThread類類,Runnable,Runnable接口接口的的根底上的,通常有兩種方法讓我們來創(chuàng)立一個(gè)新的線根底上的,通常有兩種方法讓我們來創(chuàng)立一個(gè)新的線程:程:創(chuàng)立一個(gè)創(chuàng)立一個(gè)ThreadThread類類, ,或者一個(gè)或者一個(gè)ThreadThread子類的對象;子類的對象;創(chuàng)立一個(gè)實(shí)現(xiàn)創(chuàng)立一個(gè)實(shí)現(xiàn)RunnableRunnable接口的類的對象;接口的類的對象;Xueping Shen26Thread的構(gòu)造方法的構(gòu)造方法Thread;ThreadRunnable target;ThreadRunnable target, String name;ThreadS

24、tring name;ThreadThreadGroup group, Runnable target;ThreadThreadGroup group, Runnable target, String name;ThreadThreadGroup group, Runnable target, String name, long stackSize;ThreadThreadGroup group, String name;namename: :線程的名稱線程的名稱, ,targettarget: :要運(yùn)行的線程對象要運(yùn)行的線程對象, ,groupgroup: :線程組的名線程組的名稱稱, ,s

25、tackSizestackSize: :堆棧的大小堆棧的大小ThreadThread類介紹類介紹Xueping Shen27ThreadThread類介紹類介紹Thread的主要方法的主要方法共共34個(gè)個(gè),其中其中5個(gè)不再使用了個(gè)不再使用了static Thread currentThread;int getPriority;String getName;ThreadGroup getThreadGroup;void interrupt;boolean isInterrupted;void join;joinlong millis;joinlong millis, int nanos;stat

26、ic void yield;void setNameString name;void setPriorityint priority;void start;boolean isAlive;static void sleeplong millis, int nanos;void run;static void sleeplong millis;countStackFrames; suspend; resume; stop; stopThrowable obj; Xueping Shen28ThreadThread類的常用方法類的常用方法currentThreadcurrentThread:返回當(dāng)

27、前運(yùn)行的:返回當(dāng)前運(yùn)行的ThreadThread對象。對象。setNamesetName:設(shè)置線程的名字。:設(shè)置線程的名字。 getNamegetName:返回該線程的名字。:返回該線程的名字。 setPrioritysetPriority:設(shè)置線程優(yōu)先級。:設(shè)置線程優(yōu)先級。 getPrioritygetPriority:返回線程優(yōu)先級。:返回線程優(yōu)先級。 startstart:啟動一個(gè)線程。:啟動一個(gè)線程。 runrun:線程體:線程體, ,由由startstart方法調(diào)用方法調(diào)用, ,當(dāng)當(dāng)runrun方法返回時(shí)方法返回時(shí), ,當(dāng)前的線程完畢。當(dāng)前的線程完畢。 stopstop:使調(diào)用它的線

28、程立即停頓執(zhí)行。:使調(diào)用它的線程立即停頓執(zhí)行。 isAliveisAlive:假如線程已被啟動并且未被終止,那:假如線程已被啟動并且未被終止,那么么isAliveisAlive:返回:返回truetrue。假如返回。假如返回falsefalse,那么,那么該線程是新創(chuàng)立或是已被終止的。該線程是新創(chuàng)立或是已被終止的。Xueping Shen29ThreadThread類的常用方法類的常用方法sleepsleepint nint n:使線程睡眠:使線程睡眠n n毫秒毫秒,n,n毫秒后毫秒后, ,線程可以線程可以再次運(yùn)行再次運(yùn)行。 yieldyield:將:將CPUCPU控制權(quán)主動移交到下一個(gè)可運(yùn)行

29、線程。控制權(quán)主動移交到下一個(gè)可運(yùn)行線程。joinjoin:方法:方法joinjoin將引起現(xiàn)行線程等待,直至方將引起現(xiàn)行線程等待,直至方法法joinjoin所調(diào)用的線程完畢。所調(diào)用的線程完畢。 suspendsuspend: 使線程掛起使線程掛起, ,暫停運(yùn)行。暫停運(yùn)行。 resumeresume 恢復(fù)掛起的線程恢復(fù)掛起的線程, ,使其處于可運(yùn)行狀態(tài)使其處于可運(yùn)行狀態(tài)RunnableRunnable。 waitwait:notifynotify:notifyAllnotifyAll:suspendsuspend; ;resumeresume; ;StopStop; ;目前已經(jīng)不再使用。為什么?

30、請目前已經(jīng)不再使用。為什么?請看看API.API.Xueping Shen30因?yàn)橐驗(yàn)镴avaJava線程的調(diào)度不是分時(shí)的,所以你必須確保你線程的調(diào)度不是分時(shí)的,所以你必須確保你的代碼中的線程會不時(shí)地給另外一個(gè)線程運(yùn)行的時(shí)機(jī)。的代碼中的線程會不時(shí)地給另外一個(gè)線程運(yùn)行的時(shí)機(jī)。有三種方法可以做到一點(diǎn):有三種方法可以做到一點(diǎn):讓處于運(yùn)行狀態(tài)的線程調(diào)用讓處于運(yùn)行狀態(tài)的線程調(diào)用Thread.sleepThread.sleep方法。方法。讓處于運(yùn)行狀態(tài)的線程調(diào)用讓處于運(yùn)行狀態(tài)的線程調(diào)用Thread.yieldThread.yield方法。方法。 讓處于運(yùn)行狀態(tài)的線程調(diào)用另一個(gè)線程的讓處于運(yùn)行狀態(tài)的線程調(diào)用

31、另一個(gè)線程的joinjoin方法方法。Xueping Shen31sleep和和yield的區(qū)別的區(qū)別這兩個(gè)方法都是靜態(tài)的實(shí)例方法。這兩個(gè)方法都是靜態(tài)的實(shí)例方法。yield讓運(yùn)行中的線程主動放棄當(dāng)前獲得的讓運(yùn)行中的線程主動放棄當(dāng)前獲得的CPU處處理時(shí)機(jī),但不是使該線程阻塞,而是使之轉(zhuǎn)入就緒狀理時(shí)機(jī),但不是使該線程阻塞,而是使之轉(zhuǎn)入就緒狀態(tài)。態(tài)。yield給一樣優(yōu)先級或更高的線程運(yùn)行時(shí)機(jī)給一樣優(yōu)先級或更高的線程運(yùn)行時(shí)機(jī),假如,假如當(dāng)前沒有存在一樣優(yōu)先級的線程,那么當(dāng)前沒有存在一樣優(yōu)先級的線程,那么yield什么什么都不做。都不做。而而sleep不會考慮線程的優(yōu)先級,會給其不會考慮線程的優(yōu)先級,會

32、給其他線程運(yùn)行的時(shí)機(jī),因此也會給一樣或更低優(yōu)先級線他線程運(yùn)行的時(shí)機(jī),因此也會給一樣或更低優(yōu)先級線程運(yùn)行時(shí)機(jī)程運(yùn)行時(shí)機(jī)。sleep使線程轉(zhuǎn)入阻塞狀態(tài),而使線程轉(zhuǎn)入阻塞狀態(tài),而yield使線程轉(zhuǎn)使線程轉(zhuǎn)入入runnable狀態(tài)。狀態(tài)。sleep會有中斷異常拋出會有中斷異常拋出,而,而yiled不拋出任何不拋出任何異常。異常。sleep方法具有更好的可移植性方法具有更好的可移植性,因?yàn)?,因?yàn)閥ield的的實(shí)現(xiàn)還取決于底層的操作系統(tǒng)對線程的調(diào)度策略。實(shí)現(xiàn)還取決于底層的操作系統(tǒng)對線程的調(diào)度策略。對于對于yield的主要用處是在測試階段,人為的進(jìn)步的主要用處是在測試階段,人為的進(jìn)步程序的并發(fā)性能,以幫助發(fā)

33、現(xiàn)一些隱藏的并發(fā)錯(cuò)誤程序的并發(fā)性能,以幫助發(fā)現(xiàn)一些隱藏的并發(fā)錯(cuò)誤,當(dāng)程序正常運(yùn)行時(shí),那么不能依靠當(dāng)程序正常運(yùn)行時(shí),那么不能依靠yield方法進(jìn)步程序方法進(jìn)步程序的并發(fā)行能。的并發(fā)行能。Xueping Shen32方法方法waitwait與與sleepsleep 方法一樣,都能使線方法一樣,都能使線程等待而停頓運(yùn)行,程等待而停頓運(yùn)行,其區(qū)別在于其區(qū)別在于sleepsleep方法方法不會釋放對象的鎖,而不會釋放對象的鎖,而waitwait方法進(jìn)入等待時(shí),方法進(jìn)入等待時(shí),可以釋放對象的鎖,因此別的線程能對這些加鎖可以釋放對象的鎖,因此別的線程能對這些加鎖的對象進(jìn)展操作。所以,的對象進(jìn)展操作。所以,w

34、ait,notifywait,notify和和notifyAllnotifyAll都是與同步相關(guān)聯(lián)的方法都是與同步相關(guān)聯(lián)的方法, ,只有在只有在synchronizedsynchronized方法中才可以用。方法中才可以用。在不同步的方法或代碼中那么使用在不同步的方法或代碼中那么使用sleepsleep方方法使線程暫時(shí)停頓運(yùn)行。法使線程暫時(shí)停頓運(yùn)行。Xueping Shen33 線程類線程類ThreadThread中提供以下幾個(gè)版本的中提供以下幾個(gè)版本的joinjoin方方法。法。使當(dāng)前正在運(yùn)行的線程暫停下來,等待指定的時(shí)間后使當(dāng)前正在運(yùn)行的線程暫停下來,等待指定的時(shí)間后或等待調(diào)用該方法的線程

35、完畢后,再恢復(fù)運(yùn)行?;虻却{(diào)用該方法的線程完畢后,再恢復(fù)運(yùn)行。 public final void joinpublic final void jointhrows throws InterruptedException;InterruptedException; public final void joinpublic final void joinlong millis,int long millis,int nanosnanosthrows InterruptedException;throws InterruptedException; public final void joinpu

36、blic final void joinlong millislong millisthrows throws InterruptedException;InterruptedException;joinjoin 方法:方法:舉例:舉例:TestSubThread2.javaTestSubThread2.javaXueping Shen34public void timeout/ 暫停該線程,等候其他線程暫停該線程,等候其他線程tt完畢完畢tt.join;/ 其他線程完畢后,繼續(xù)進(jìn)展該線程其他線程完畢后,繼續(xù)進(jìn)展該線程 join:方法:方法join將引起現(xiàn)行線程等待,直至方法將引起現(xiàn)行線程等待

37、,直至方法join所調(diào)用的線程完畢。所調(diào)用的線程完畢。Xueping Shen35Xueping Shen36將一個(gè)類定義為將一個(gè)類定義為Thread的子類的子類,那么這個(gè)類就可以那么這個(gè)類就可以 用來創(chuàng)立線程。用來創(chuàng)立線程。 這個(gè)類中有一個(gè)這個(gè)類中有一個(gè)至關(guān)重要的方法至關(guān)重要的方法public void run,這個(gè)方法稱為,這個(gè)方法稱為線程體線程體,它是整個(gè)線程的,它是整個(gè)線程的核心核心,線程線程所要完成任務(wù)的代碼都定義在所要完成任務(wù)的代碼都定義在線程體線程體中,實(shí)中,實(shí)際上際上不同功能的線程之間的區(qū)別不同功能的線程之間的區(qū)別就在于它們線程體就在于它們線程體的不同的不同舉例:舉例:Thre

38、adTester.java TestSubThread.java TestMyThread.java Example19_1.javaExample19_1.java UseThread.javaUseThread.java應(yīng)用線程類創(chuàng)立線程應(yīng)用線程類創(chuàng)立線程Xueping Shen37創(chuàng)建線程對象創(chuàng)建線程對象啟動一個(gè)線程啟動一個(gè)線程線程體線程體的執(zhí)行的執(zhí)行線程子類名線程子類名 線程對象名線程對象名=new 線程子類名(實(shí)際參數(shù))線程子類名(實(shí)際參數(shù))線程對象名線程對象名.start();Run()方法的執(zhí)行方法的執(zhí)行TimePrinter.javaXueping Shen38Thread.s

39、leep方法的使用,注意異常的拋出Xueping Shen39Xueping Shen40Xueping Shen41Thead.yield方法Xueping Shen42主線程和其他線程共存Xueping Shen43Xueping Shen44Thread.sleep方方法的使用,注意異法的使用,注意異常的拋出常的拋出Xueping Shen45Xueping Shen46join方法的使用,注意異常的拋出。保證了主線程最后完畢Xueping Shen47Xueping Shen48Xueping Shen49Xueping Shen50應(yīng)用應(yīng)用Runnable接口創(chuàng)立線程接口創(chuàng)立線程Ru

40、nnable是是Java中用以實(shí)現(xiàn)線程的接口,中用以實(shí)現(xiàn)線程的接口,從根本從根本上講,任何實(shí)現(xiàn)線程功能的類都必須實(shí)現(xiàn)該接口。上講,任何實(shí)現(xiàn)線程功能的類都必須實(shí)現(xiàn)該接口。ThreadRunnable target;ThreadRunnable target, String name;wRunnable接口中只定義了一個(gè)方法就是接口中只定義了一個(gè)方法就是run方法,也就是線程體。方法,也就是線程體。舉例舉例: TimePrinter1.java TestMyClassThread.java UseRunnable.java UseRunnable.htmlXueping Shen51Xueping

41、 Shen52Xueping Shen53Xueping Shen54因?yàn)橐驗(yàn)镴ava只允許單繼承,假如一個(gè)類已經(jīng)繼承了只允許單繼承,假如一個(gè)類已經(jīng)繼承了Thread,就不能再繼承其他類。,就不能再繼承其他類。n比方對于比方對于Applet程序,由于必須繼承程序,由于必須繼承java. applet.Applet,因此就只能采取這種實(shí)現(xiàn)接口的方,因此就只能采取這種實(shí)現(xiàn)接口的方法。法。特別是在除了特別是在除了run方法以外方法以外,并不打算重寫并不打算重寫Thread類的其它方法的情況下類的其它方法的情況下,以實(shí)現(xiàn)以實(shí)現(xiàn)Runnable接口的方式生接口的方式生成新線程就顯得更加合理了。成新線程就

42、顯得更加合理了。適用于采用實(shí)現(xiàn)適用于采用實(shí)現(xiàn)Runnable接口方法的情況接口方法的情況Xueping Shen55終止線程終止線程當(dāng)線程執(zhí)行完當(dāng)線程執(zhí)行完runrun方法,它將自然終止運(yùn)方法,它將自然終止運(yùn)行。行。 ThreadThread有一個(gè)有一個(gè)stopstop方法,可以強(qiáng)迫完畢方法,可以強(qiáng)迫完畢線程,但這種方法是不平安的。因此,在線程,但這種方法是不平安的。因此,在JDK1.2JDK1.2開場的版本中,開場的版本中,stopstop方法已經(jīng)被廢方法已經(jīng)被廢棄。棄。實(shí)際編程中,一般是定義一個(gè)標(biāo)志變量,然后實(shí)際編程中,一般是定義一個(gè)標(biāo)志變量,然后通過程序來改變標(biāo)志變量的值,從而控制線程通過程序來改變標(biāo)志變量的值,從而控制線程從從runrun方法中自然退出。方法中自然退出。Xueping Shen56Xueping Shen571.創(chuàng)立一個(gè)創(chuàng)立一個(gè)Thread類的子類類的子類2.在子類中將希望該線程做的工作寫到在子類中將希望該線程做的工作寫到run里面里面3.生成該子類的一個(gè)對象生成該子類

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論