教學(xué)多線(xiàn)程專(zhuān)業(yè)知識(shí)講座省公共課一等獎(jiǎng)全國(guó)賽課獲獎(jiǎng)?wù)n件_第1頁(yè)
教學(xué)多線(xiàn)程專(zhuān)業(yè)知識(shí)講座省公共課一等獎(jiǎng)全國(guó)賽課獲獎(jiǎng)?wù)n件_第2頁(yè)
教學(xué)多線(xiàn)程專(zhuān)業(yè)知識(shí)講座省公共課一等獎(jiǎng)全國(guó)賽課獲獎(jiǎng)?wù)n件_第3頁(yè)
教學(xué)多線(xiàn)程專(zhuān)業(yè)知識(shí)講座省公共課一等獎(jiǎng)全國(guó)賽課獲獎(jiǎng)?wù)n件_第4頁(yè)
教學(xué)多線(xiàn)程專(zhuān)業(yè)知識(shí)講座省公共課一等獎(jiǎng)全國(guó)賽課獲獎(jiǎng)?wù)n件_第5頁(yè)
已閱讀5頁(yè),還剩65頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

java多線(xiàn)程程序設(shè)計(jì)第1頁(yè)

程序、進(jìn)程、線(xiàn)程

多任務(wù)、多進(jìn)程、多線(xiàn)程

Java對(duì)多線(xiàn)程支持、Java根本程Java中創(chuàng)建線(xiàn)程方法線(xiàn)程休眠過(guò)程線(xiàn)程生命周期線(xiàn)程調(diào)度和優(yōu)先級(jí)內(nèi)容提要

第2頁(yè)程序、進(jìn)程程序:計(jì)算機(jī)指令集合,一段靜態(tài)代碼,是應(yīng)用軟件執(zhí)行藍(lán)本。它以文件形式存放在磁盤(pán)上。進(jìn)程:一個(gè)獨(dú)立程序每一次運(yùn)行稱(chēng)為一個(gè)進(jìn)程,是程序一次動(dòng)態(tài)執(zhí)行過(guò)程,它對(duì)應(yīng)了從代碼加載、執(zhí)行到執(zhí)行完成一個(gè)完整過(guò)程,這個(gè)過(guò)程也是進(jìn)程本身從產(chǎn)生、發(fā)展到消亡過(guò)程。作為執(zhí)行藍(lán)本同一段程序能夠被屢次加載到系統(tǒng)不一樣內(nèi)存區(qū)域分別執(zhí)行,形成不一樣進(jìn)程。比如:用word編輯文稿時(shí),同時(shí)在另一個(gè)窗口下載音樂(lè),這兩個(gè)獨(dú)立程序在同時(shí)運(yùn)行,稱(chēng)為兩個(gè)進(jìn)程。一個(gè)應(yīng)用程序執(zhí)行(如java程序)也對(duì)應(yīng)于一個(gè)進(jìn)程。操作系統(tǒng)周期性將CPU切換到不一樣任務(wù),分時(shí)間片輪番運(yùn)行每一個(gè)進(jìn)程,而每一個(gè)進(jìn)程都像是連續(xù)運(yùn)行。每一個(gè)進(jìn)程占有自己內(nèi)存空間。第3頁(yè)線(xiàn)程線(xiàn)程:比進(jìn)程更小執(zhí)行單位,一個(gè)進(jìn)程在其執(zhí)行過(guò)程中能夠產(chǎn)生多個(gè)線(xiàn)程,形成多條執(zhí)行線(xiàn)索,每條線(xiàn)索即每個(gè)線(xiàn)程也有它本身產(chǎn)生、存在和消亡過(guò)程,也是一個(gè)動(dòng)態(tài)過(guò)程。日常生活中程序、進(jìn)程和線(xiàn)程:程序:每學(xué)期課程表進(jìn)程:每學(xué)期教學(xué)活動(dòng)線(xiàn)程:每門(mén)課教學(xué)過(guò)程一個(gè)程序運(yùn)行后最少有一個(gè)進(jìn)程,一個(gè)進(jìn)程里能夠包含多個(gè)線(xiàn)程,但最少要包含一個(gè)線(xiàn)程。第4頁(yè)單線(xiàn)程早期在計(jì)算機(jī)上開(kāi)發(fā)程序大多是單線(xiàn)程,就是一個(gè)程序只有一條從頭到尾執(zhí)行線(xiàn)索。我們之前編寫(xiě)程序都是單線(xiàn)程程序,每個(gè)程序都有一個(gè)入口、一個(gè)出口以及一個(gè)次序執(zhí)行序列,在程序執(zhí)行過(guò)程中任何指定時(shí)刻,都只有一個(gè)單獨(dú)執(zhí)行點(diǎn)。第5頁(yè)多線(xiàn)程多線(xiàn)程是一個(gè)進(jìn)程中多段代碼同時(shí)并發(fā)執(zhí)行,是指程序中包含多條執(zhí)行路徑。在一個(gè)程序中同時(shí)運(yùn)行多個(gè)不一樣線(xiàn)程來(lái)執(zhí)行不一樣任務(wù),即允許單個(gè)程序創(chuàng)建多個(gè)并行執(zhí)行任務(wù)來(lái)完成各自任務(wù)。采取多線(xiàn)程,一個(gè)進(jìn)程若干任務(wù)就能夠細(xì)分為多個(gè)部分由多線(xiàn)程來(lái)處理,這么能夠增強(qiáng)整個(gè)程序吞吐量,加緊反應(yīng)時(shí)間。比如:瀏覽器程序就是一個(gè)多線(xiàn)程例子,

當(dāng)下載一個(gè)應(yīng)用程序或圖片時(shí),能夠同時(shí)進(jìn)行其它任務(wù),比如播放動(dòng)畫(huà)或聲音應(yīng)用程序、打印一些內(nèi)容、進(jìn)行排序或者其它工作。聊天室(多人同時(shí)聊天)

在現(xiàn)實(shí)生活中,很多過(guò)程都含有多條線(xiàn)索同時(shí)動(dòng)作特征,比如,我們能夠一邊走路,一邊接電話(huà),兩件事并行。假如不允許這么做,我們會(huì)感覺(jué)極難受。第6頁(yè)單線(xiàn)程程序多線(xiàn)程程序一個(gè)線(xiàn)程兩個(gè)線(xiàn)程多線(xiàn)程多線(xiàn)程和傳統(tǒng)單線(xiàn)程在程序設(shè)計(jì)上最大區(qū)分在于,因?yàn)楦鱾€(gè)線(xiàn)程控制流彼此獨(dú)立,使得各個(gè)線(xiàn)程之間代碼是亂序執(zhí)行。第7頁(yè)程序、進(jìn)程、線(xiàn)程

多任務(wù)、多進(jìn)程、多線(xiàn)程

Java對(duì)多線(xiàn)程支持、Java根本程Java中創(chuàng)建線(xiàn)程方法線(xiàn)程休眠過(guò)程線(xiàn)程生命周期線(xiàn)程調(diào)度和優(yōu)先級(jí)內(nèi)容提要

第8頁(yè)多任務(wù)、多進(jìn)程、多線(xiàn)程多線(xiàn)程和多任務(wù)是兩個(gè)現(xiàn)有聯(lián)絡(luò)又有區(qū)分概念:多任務(wù)是針對(duì)操作系統(tǒng)而言,代表著操作系統(tǒng)能夠同時(shí)運(yùn)行多個(gè)應(yīng)用程序(多進(jìn)程),比如我們能夠利用計(jì)算機(jī)邊聽(tīng)音樂(lè),邊瀏覽網(wǎng)頁(yè),或者從網(wǎng)絡(luò)上下載東西,等等。以前古老DOS操作系統(tǒng)(V6.22)是單任務(wù),還沒(méi)有線(xiàn)程概念,系統(tǒng)在每次只能做一件事情。比如你在copy東西時(shí)候不能rename文件名。為了提升系統(tǒng)利用效率,采取批處理來(lái)批量執(zhí)行任務(wù)?,F(xiàn)在操作系統(tǒng)都是多任務(wù)操作系統(tǒng),每個(gè)運(yùn)行任務(wù)就是操作系統(tǒng)所做一件事情,比如你在聽(tīng)歌同時(shí)還在用MSN和摯友聊天。聽(tīng)歌和聊天就是兩個(gè)任務(wù),這個(gè)兩個(gè)任務(wù)是“同時(shí)”進(jìn)行。一個(gè)任務(wù)普通對(duì)應(yīng)一個(gè)進(jìn)程,也可能包含好幾個(gè)進(jìn)程。比如運(yùn)行MSN就對(duì)應(yīng)一個(gè)MSN進(jìn)程,假如你用是windows系統(tǒng),你就能夠在任務(wù)管理器中看到操作系統(tǒng)正在運(yùn)行進(jìn)程信息。第9頁(yè)多任務(wù)、多進(jìn)程、多線(xiàn)程多線(xiàn)程是針對(duì)一個(gè)程序而言,代表著一個(gè)程序內(nèi)部能夠同時(shí)執(zhí)行線(xiàn)程個(gè)數(shù),而每個(gè)線(xiàn)程能夠完成不一樣任務(wù)。普通來(lái)說(shuō),當(dāng)運(yùn)行一個(gè)應(yīng)用程序時(shí)候,就開(kāi)啟了一個(gè)進(jìn)程,當(dāng)然有些會(huì)開(kāi)啟多個(gè)進(jìn)程。開(kāi)啟進(jìn)程時(shí)候,操作系統(tǒng)會(huì)為進(jìn)程分配資源,其中最主要資源是內(nèi)存空間,因?yàn)槌绦蚴窃趦?nèi)存中運(yùn)行。在進(jìn)程中,有些程序流程塊是能夠亂序執(zhí)行,而且這個(gè)代碼塊能夠同時(shí)被屢次執(zhí)行。實(shí)際上,這么代碼塊就是線(xiàn)程體。線(xiàn)程是進(jìn)程中亂序執(zhí)行代碼流程。當(dāng)多個(gè)線(xiàn)程同時(shí)運(yùn)行時(shí)候,這么執(zhí)行模式成為并發(fā)執(zhí)行。多線(xiàn)程目標(biāo)是為了最大程度利用CPU資源。第10頁(yè)多任務(wù)、多進(jìn)程、多線(xiàn)程對(duì)于一個(gè)進(jìn)程中多個(gè)線(xiàn)程來(lái)說(shuō),多個(gè)線(xiàn)程共享進(jìn)程內(nèi)存塊,當(dāng)有新線(xiàn)程產(chǎn)生時(shí)候,操作系統(tǒng)不分配新內(nèi)存,而是讓新線(xiàn)程共享原有進(jìn)程塊內(nèi)存。所以,線(xiàn)程間通信很輕易,速度也很快。不一樣進(jìn)程因?yàn)樘幱诓灰粯觾?nèi)存塊,所以進(jìn)程之間通信相對(duì)困難。實(shí)際上,操作系統(tǒng)多進(jìn)程實(shí)現(xiàn)了多任務(wù)并發(fā)執(zhí)行,程序多線(xiàn)程實(shí)現(xiàn)了進(jìn)程并發(fā)執(zhí)行。多任務(wù)、多進(jìn)程、多線(xiàn)程前提都是要求操作系統(tǒng)提供多任務(wù)、多進(jìn)程、多線(xiàn)程支持。第11頁(yè)多任務(wù)、多進(jìn)程、多線(xiàn)程歸納起來(lái),操作系統(tǒng)能夠同時(shí)執(zhí)行多個(gè)任務(wù),每個(gè)任務(wù)就是進(jìn)程,進(jìn)程能夠同時(shí)執(zhí)行多個(gè)任務(wù),每個(gè)任務(wù)就是線(xiàn)程。第12頁(yè)程序、進(jìn)程、線(xiàn)程多任務(wù)、多進(jìn)程、多線(xiàn)程

Java對(duì)多線(xiàn)程支持、Java根本程Java中創(chuàng)建線(xiàn)程方法線(xiàn)程休眠過(guò)程線(xiàn)程生命周期線(xiàn)程調(diào)度和優(yōu)先級(jí)內(nèi)容提要

第13頁(yè)Java對(duì)多線(xiàn)程支持很多程序語(yǔ)言都是利用外部線(xiàn)程軟件包來(lái)實(shí)現(xiàn)多線(xiàn)程。如C語(yǔ)言。Java是第一個(gè)支持內(nèi)置線(xiàn)程操作主流編程語(yǔ)言。Java語(yǔ)言一大特征就是內(nèi)置對(duì)多線(xiàn)程支持。多線(xiàn)程指同時(shí)存在幾個(gè)執(zhí)行體,按幾條不一樣執(zhí)行線(xiàn)索共同工作情況,它使得編程人員能夠很方便地開(kāi)發(fā)出含有多線(xiàn)程功效、能同時(shí)處理多個(gè)任務(wù)功效強(qiáng)大應(yīng)用程序。即使執(zhí)行線(xiàn)程給人一個(gè)幾個(gè)事件同時(shí)發(fā)生感覺(jué),但這只是一個(gè)錯(cuò)覺(jué),因?yàn)槲矣?jì)算機(jī)在任何給定時(shí)刻只能執(zhí)行那些線(xiàn)程中一個(gè),為了建立這些線(xiàn)程正在同時(shí)執(zhí)行感覺(jué),java快速地把控制從一個(gè)線(xiàn)程切換到另外一個(gè)線(xiàn)程多個(gè)線(xiàn)程執(zhí)行是并發(fā),也是一個(gè)邏輯上“同時(shí)”,而不是物理上“同時(shí)”。假如系統(tǒng)只有一個(gè)CPU,那么真正“同時(shí)”是不可能,不過(guò)因?yàn)镃PU速度非???,用戶(hù)感覺(jué)不到其中區(qū)分,我們也沒(méi)必要去關(guān)心它,只需要構(gòu)想各個(gè)線(xiàn)程是同時(shí)執(zhí)行即可。假如系統(tǒng)有多個(gè)CPU,能夠?qū)崿F(xiàn)真正“同時(shí)”執(zhí)行。在應(yīng)用程序中使用多線(xiàn)程不會(huì)增加CPU數(shù)據(jù)處理能力。第14頁(yè)Java根本程普通常見(jiàn)Java應(yīng)用程序都是單線(xiàn)程。比如,用java命令運(yùn)行一個(gè)最簡(jiǎn)單HelloWorldJava應(yīng)用程序時(shí),就開(kāi)啟了一個(gè)JVM進(jìn)程,JVM找到程序程序入口點(diǎn)main(),然后運(yùn)行main()方法,這么就產(chǎn)生了一個(gè)線(xiàn)程,這個(gè)線(xiàn)程稱(chēng)之為“根本程”。當(dāng)JVM加載代碼,發(fā)覺(jué)main方法之后,就會(huì)開(kāi)啟一個(gè)線(xiàn)程,這個(gè)線(xiàn)程稱(chēng)作“根本程”,該線(xiàn)程負(fù)責(zé)執(zhí)行main方法。假如main中沒(méi)有創(chuàng)建其它線(xiàn)程,那么當(dāng)main方法執(zhí)行完最終一條語(yǔ)句,JVM就會(huì)結(jié)束我們java應(yīng)用程序。假如main中又創(chuàng)建了其它線(xiàn)程,那么JVM就要在根本程和其它線(xiàn)程之間輪番切換,確保每個(gè)線(xiàn)程都有機(jī)會(huì)使用CPU資源,main方法即使執(zhí)行完最終語(yǔ)句,JVM也不會(huì)結(jié)束我們程序,JVM一直等到程序中全部線(xiàn)程都結(jié)束之后,才結(jié)束我們java應(yīng)用程序第15頁(yè)Java根本程第16頁(yè)多線(xiàn)程優(yōu)點(diǎn)使用多線(xiàn)程進(jìn)行程序設(shè)計(jì)含有以下優(yōu)點(diǎn):

1)多線(xiàn)程編程簡(jiǎn)單,效率高(能直接共享數(shù)據(jù)和資源,多進(jìn)程不能)

2)適合于開(kāi)發(fā)服務(wù)程序(如Web服務(wù),聊天服務(wù)等)

3)適合于開(kāi)發(fā)有各種交互接口程序(如聊天程序客戶(hù)端,網(wǎng)絡(luò)下載工具)

4)減輕編寫(xiě)交互頻繁、包括面多程序困難(如監(jiān)聽(tīng)網(wǎng)絡(luò)端口)

5)程序吞吐量會(huì)得到改進(jìn)(同時(shí)監(jiān)聽(tīng)各種設(shè)備,如網(wǎng)絡(luò)端口、串口、并口以及其它外設(shè))

6)有多個(gè)處理器系統(tǒng),能夠并發(fā)運(yùn)行不一樣線(xiàn)程(不然,任何時(shí)刻只有一個(gè)線(xiàn)程在運(yùn)行)第17頁(yè)程序、進(jìn)程、線(xiàn)程多任務(wù)、多進(jìn)程、多線(xiàn)程

Java對(duì)多線(xiàn)程支持、Java根本程Java中創(chuàng)建線(xiàn)程方法線(xiàn)程休眠過(guò)程線(xiàn)程生命周期線(xiàn)程調(diào)度和優(yōu)先級(jí)內(nèi)容提要

第18頁(yè)Java中創(chuàng)建線(xiàn)程方法Java虛擬機(jī)允許應(yīng)用程序并發(fā)地運(yùn)行多個(gè)執(zhí)行線(xiàn)程。Java語(yǔ)言提供了多線(xiàn)程編程擴(kuò)展點(diǎn),并給出了功效強(qiáng)大線(xiàn)程控制API。Java線(xiàn)程是經(jīng)過(guò)java軟件包java.lang中定義Thread類(lèi)來(lái)實(shí)現(xiàn)。Java中有兩種方法創(chuàng)建線(xiàn)程:繼承Thread類(lèi)。

實(shí)現(xiàn)Runnable接口。不論使用哪種方法,都需要用到Java基礎(chǔ)類(lèi)庫(kù)中Thread類(lèi)及其方法。在Java語(yǔ)言中,線(xiàn)程也是一個(gè)對(duì)象,但并非任何對(duì)象都能夠成為線(xiàn)程,只有實(shí)現(xiàn)Runnable接口或繼承了Thread類(lèi)對(duì)象才能成為線(xiàn)程。第19頁(yè)

Thread類(lèi)publicclassThreadextendsObjectimplementsRunnableThread類(lèi)是一個(gè)詳細(xì)類(lèi),即不是抽象類(lèi),該類(lèi)封裝了線(xiàn)程行為。要?jiǎng)?chuàng)建一個(gè)線(xiàn)程,程序員必須創(chuàng)建一個(gè)Thread類(lèi)子類(lèi)。Thread類(lèi)提供了大量方法來(lái)方便控制各個(gè)線(xiàn)程。第20頁(yè)Thread類(lèi)結(jié)構(gòu)方法(1)publicThread():創(chuàng)建一個(gè)系統(tǒng)線(xiàn)程類(lèi)對(duì)象。線(xiàn)程默認(rèn)名是Thread-n,n是從0開(kāi)始遞增整數(shù)。(2)publicThread(Stringname):在第一個(gè)結(jié)構(gòu)方法基礎(chǔ)上,為所創(chuàng)建線(xiàn)程對(duì)象指定一個(gè)字符串名稱(chēng)供以后使用。(3)publicThread(Runnabletarget):該結(jié)構(gòu)方法包含了Runnable類(lèi)型參數(shù),它是實(shí)現(xiàn)Runnable接口類(lèi)實(shí)例對(duì)象,基于該結(jié)構(gòu)方法創(chuàng)建線(xiàn)程對(duì)象,將線(xiàn)程業(yè)務(wù)邏輯交由參數(shù)所傳遞Runnable對(duì)象去實(shí)現(xiàn)。target是實(shí)現(xiàn)了Runnable接口類(lèi)target對(duì)象。線(xiàn)程默認(rèn)名是Thread-n,n是從0開(kāi)始遞增整數(shù)。第21頁(yè)Thread類(lèi)結(jié)構(gòu)方法(4)publicThread(Runnabletarget,Stringname):實(shí)現(xiàn)前兩個(gè)結(jié)構(gòu)方法功效。(5)publicThread(ThreadGroupgroup,Runnabletarget):生成一個(gè)指定線(xiàn)程組和目標(biāo)對(duì)象線(xiàn)程。(6)publicThread(ThreadGroupgroup,Stringname):生成一個(gè)指定線(xiàn)程組和名字線(xiàn)程。利用結(jié)構(gòu)方法創(chuàng)建新線(xiàn)程對(duì)象之后,這個(gè)對(duì)象中相關(guān)數(shù)據(jù)被初始化,從而進(jìn)入線(xiàn)程生命周期第一個(gè)狀態(tài)—新建狀態(tài)。第22頁(yè)Thread類(lèi)主要組員方法

方法

功效CurrentThread()返回當(dāng)前運(yùn)行Thread對(duì)象

start()開(kāi)啟線(xiàn)程

run()由調(diào)度程序調(diào)用,當(dāng)run()方法返回時(shí),該線(xiàn)程停頓stop()使調(diào)用它線(xiàn)程馬上停頓執(zhí)行sleep(longn)使線(xiàn)程睡眠n毫秒,n毫秒后,線(xiàn)程能夠再次運(yùn)行suspend()使線(xiàn)程掛起,暫停運(yùn)行NotRunnable

resume()恢復(fù)掛起線(xiàn)程,使處于可運(yùn)行狀態(tài)Runnable

yield()將CPU控制權(quán)主動(dòng)移交到下一個(gè)可運(yùn)行線(xiàn)程★第23頁(yè)Thread類(lèi)主要方法(續(xù))setName(String)賦予線(xiàn)程一個(gè)名字

getName()取得由setName()方法設(shè)置線(xiàn)程名字字符串getPriority()返回線(xiàn)程優(yōu)先級(jí)setPriority(int)設(shè)置線(xiàn)程優(yōu)先級(jí)join()當(dāng)前線(xiàn)程等候調(diào)用該方法線(xiàn)程結(jié)束后,再往下執(zhí)行setDaemon(boolean)設(shè)置該線(xiàn)程是daemon線(xiàn)程還是用戶(hù)線(xiàn)程,Daemon線(xiàn)程也稱(chēng)服務(wù)線(xiàn)程,通常編成無(wú)限循環(huán),在后臺(tái)連續(xù)運(yùn)行。第24頁(yè)Thread類(lèi)主要方法(續(xù))在上述方法中,start()方法與run()方法最為慣用,start()方法用于開(kāi)啟線(xiàn)程,run()方法為線(xiàn)程主體方法,能夠依據(jù)需要重寫(xiě)run()方法。第25頁(yè)Thread類(lèi)主要方法(續(xù))publicvoidstart()開(kāi)啟線(xiàn)程,使該線(xiàn)程開(kāi)始執(zhí)行。屢次開(kāi)啟一個(gè)線(xiàn)程是非法。尤其是當(dāng)線(xiàn)程已經(jīng)結(jié)束執(zhí)行后,不能再重新開(kāi)啟。第26頁(yè)Thread類(lèi)主要方法(續(xù))publicvoidrun():Thread子類(lèi)應(yīng)該重寫(xiě)該方法,內(nèi)容為該線(xiàn)程應(yīng)執(zhí)行任務(wù)。第27頁(yè)Thread類(lèi)主要方法(續(xù))

publicfinalvoidsetPriority(intnewPriority)線(xiàn)程執(zhí)行是一個(gè)搶占方式,優(yōu)先級(jí)高比優(yōu)先級(jí)低要取得更多執(zhí)行時(shí)間,假如想讓一個(gè)線(xiàn)程比其它線(xiàn)程有更多時(shí)間運(yùn)行,能夠經(jīng)過(guò)設(shè)置線(xiàn)程優(yōu)先級(jí)處理。如一個(gè)線(xiàn)程創(chuàng)建后,能夠經(jīng)過(guò)調(diào)用setPriority()方法來(lái)設(shè)置其優(yōu)先級(jí)。newPriority是一個(gè)1-10之間正整數(shù),數(shù)值越大,優(yōu)先級(jí)越高,系統(tǒng)有一些常數(shù)值:1.MAX_PRIORITY:最高優(yōu)先級(jí)(值為10)2.MIN_PRIORITY:最低優(yōu)先級(jí)(值為1)3.NORM_PRIORITY:默認(rèn)優(yōu)先級(jí)(值為5)線(xiàn)程創(chuàng)建時(shí),繼承了父線(xiàn)程優(yōu)先級(jí)。父線(xiàn)程是指執(zhí)行創(chuàng)建新線(xiàn)程對(duì)象語(yǔ)句線(xiàn)程,它可能是根本程,也可能是用戶(hù)自己定義線(xiàn)程。普通情況下,根本程含有默認(rèn)優(yōu)先級(jí)。第28頁(yè)Thread類(lèi)主要方法(續(xù))publicfinalintgetPriority()返回線(xiàn)程優(yōu)先級(jí)。在線(xiàn)程創(chuàng)建之后,能夠經(jīng)過(guò)getPriority()方法得到線(xiàn)程優(yōu)先級(jí),也能夠經(jīng)過(guò)setPriority()方法改變線(xiàn)程優(yōu)先級(jí)。第29頁(yè)Thread類(lèi)主要方法(續(xù))publicfinalStringgetName()publicfinalvoidsetName(String

name)每個(gè)線(xiàn)程在創(chuàng)建時(shí)可認(rèn)為其指定名稱(chēng),如果未指定,則由系統(tǒng)進(jìn)行指定。對(duì)于根本程名稱(chēng)是:main。對(duì)于其他線(xiàn)程,默認(rèn)名稱(chēng)樣式是:“Thread-數(shù)字”??梢允褂肨hread類(lèi)getName()方法獲得線(xiàn)程名,使用setName()方法設(shè)置線(xiàn)程名。不一樣線(xiàn)程可以有相同名稱(chēng),不能使用線(xiàn)程名來(lái)區(qū)分線(xiàn)程。第30頁(yè)Thread類(lèi)主要方法(續(xù))publiclonggetId()

每個(gè)線(xiàn)程在創(chuàng)建時(shí)會(huì)被分配一個(gè)ID屬性,能夠使用Thread類(lèi)getID()方法取得線(xiàn)程ID。Thread類(lèi)并沒(méi)有提供修改ID方法。該方法返回該線(xiàn)程標(biāo)識(shí)符。線(xiàn)程ID是一個(gè)正long數(shù),在創(chuàng)建該線(xiàn)程時(shí)生成。線(xiàn)程ID是唯一,并終生不變。線(xiàn)程終止時(shí),該線(xiàn)程ID能夠被重新使用。不一樣線(xiàn)程不能有相同ID,系統(tǒng)是使用ID值來(lái)區(qū)分線(xiàn)程。第31頁(yè)方法1:繼承Thread類(lèi)創(chuàng)建線(xiàn)程Java.lang包中Thread類(lèi),是一個(gè)專(zhuān)門(mén)用來(lái)創(chuàng)建線(xiàn)程類(lèi),該類(lèi)中提供了線(xiàn)程所用到屬性和方法,這個(gè)類(lèi)已經(jīng)具備了創(chuàng)建和運(yùn)行線(xiàn)程全部必要架構(gòu),經(jīng)過(guò)重寫(xiě)Thread類(lèi)中run()方法,以實(shí)現(xiàn)用戶(hù)所需要功效,實(shí)例化自定義Thread類(lèi),使用start()方法開(kāi)啟線(xiàn)程。第32頁(yè)方法1:繼承Thread類(lèi)創(chuàng)建線(xiàn)程經(jīng)過(guò)創(chuàng)建Thread類(lèi)子類(lèi)來(lái)實(shí)現(xiàn)多線(xiàn)程。步驟以下:1.設(shè)計(jì)Thread類(lèi)子類(lèi),重寫(xiě)父類(lèi)run()方法。classmyThreadextendsThread{publicvoidrun() {//添加你自己線(xiàn)程代碼

}}第33頁(yè)方法1:繼承Thread類(lèi)創(chuàng)建線(xiàn)程2.在main()方法里面實(shí)例化myThread類(lèi),并運(yùn)行該對(duì)象start()方法。publicstaticvoidmain(Stringargs[]){ myThreadthread1=newmyThread(“線(xiàn)程1”);//為該線(xiàn)程命名

thread1.start();//使用start()方法開(kāi)啟線(xiàn)程。當(dāng)JVM將CPU使用權(quán)切換給線(xiàn)程時(shí),會(huì)自動(dòng)執(zhí)行run()方法。}注意:線(xiàn)程開(kāi)啟是需要一個(gè)創(chuàng)建它進(jìn)程,比如上面開(kāi)啟線(xiàn)程代碼能夠?qū)懺谝粋€(gè)main()方法里面,運(yùn)行時(shí)實(shí)際上有兩個(gè)線(xiàn)程,一個(gè)是根本程,一個(gè)是名為“線(xiàn)程1”線(xiàn)程,這兩個(gè)線(xiàn)程同時(shí)運(yùn)行。第34頁(yè)【例1】繼承Thread類(lèi)創(chuàng)建線(xiàn)程///創(chuàng)建一個(gè)主運(yùn)行類(lèi)///在主運(yùn)行方法中,創(chuàng)建兩個(gè)線(xiàn)程,讓其交替運(yùn)行publicclassthreadtest1{publicstaticvoidmain(String[]args){computet1=newcompute();compute1t2=newcompute1();t1.setName("線(xiàn)程1");t2.setName("線(xiàn)程2");t1.start();t2.start();}}///創(chuàng)建compute線(xiàn)程類(lèi)///在這個(gè)線(xiàn)程類(lèi)中,經(jīng)過(guò)循環(huán)語(yǔ)句輸出1-10十個(gè)整型數(shù)據(jù)classcomputeextendsThread{

publicvoidrun(){for(inti=0;i<10;i++){System.out.println(this.getName()+":"+i);}}}///創(chuàng)建compute線(xiàn)程類(lèi)///在這個(gè)線(xiàn)程類(lèi)中,經(jīng)過(guò)循環(huán)語(yǔ)句輸出說(shuō)明性語(yǔ)句classcompute1extendsThread{publicvoidrun(){for(inti=0;i<10;i++){System.out.println(this.getName()+":"+i);}}}在使用java語(yǔ)言編寫(xiě)多線(xiàn)程程序時(shí),運(yùn)行結(jié)果與操作系統(tǒng)親密相關(guān),即使在同一臺(tái)機(jī)器上,屢次運(yùn)行同一個(gè)程序,結(jié)果也可能不一樣。實(shí)際上全部多線(xiàn)程代碼執(zhí)行次序都是不確定,每次執(zhí)行結(jié)果都是隨機(jī)。第35頁(yè)【例2:(書(shū)例10-1)】繼承Thread類(lèi)創(chuàng)建線(xiàn)程//繼承Tread類(lèi)publicclassMyThreadextendsThread{//count變量用于統(tǒng)計(jì)打印次數(shù)并共享變量

privatestaticintcount=0; publicMyThread(Stringname){ super(name); } publicstaticvoidmain(String[]args){//main方法開(kāi)始

MyThreadp=newMyThread("t1");//創(chuàng)建一個(gè)線(xiàn)程實(shí)例

p.start();//執(zhí)行線(xiàn)程

for(inti=0;i<5;i++){//根本程main方法執(zhí)行一個(gè)循環(huán) count++; System.out.println(count+":main");//根本程中打印count+“main”變量值,并換行 } } publicvoidrun(){//線(xiàn)程類(lèi)必須有run()方法

for(inti=0;i<5;i++){ count++; System.out.println(count+":"+this.getName()); } }}第36頁(yè)【例3】繼承Thread類(lèi)創(chuàng)建線(xiàn)程classSimpleThreadextendsThread{ privateStringname; publicSimpleThread(Stringname){ =name; } publicvoidrun(){//線(xiàn)程要執(zhí)行邏輯操作

for(inti=0;i<10;i++){System.out.print();try{ sleep(1000);//睡眠1秒鐘,方便觀察線(xiàn)程執(zhí)行結(jié)果

}catch(InterruptedExceptione){ e.printStackTrace(); }}}}publicclassThreadDemo1{ publicstaticvoidmain(String[]args){ SimpleThreadthread1=newSimpleThread("張");//創(chuàng)建線(xiàn)程對(duì)象實(shí)例

SimpleThreadthread2=newSimpleThread("李"); SimpleThreadthread3=newSimpleThread("王"); thread1.start();//開(kāi)啟線(xiàn)程

thread2.start();//開(kāi)啟線(xiàn)程

thread3.start();//開(kāi)啟線(xiàn)程

}}第37頁(yè)方法1:繼承Thread類(lèi)創(chuàng)建線(xiàn)程當(dāng)線(xiàn)程類(lèi)繼承Thread類(lèi)時(shí),直接使用this即可獲取當(dāng)前線(xiàn)程。運(yùn)行多線(xiàn)程程序時(shí)不要忘了java程序運(yùn)行時(shí)默認(rèn)根本程,main()方法方法體就是根本程線(xiàn)程執(zhí)行體。使用繼承Thread類(lèi)方法來(lái)創(chuàng)建線(xiàn)程類(lèi)時(shí),多個(gè)線(xiàn)程之間無(wú)法共享線(xiàn)程類(lèi)實(shí)例變量。第38頁(yè)方法2:實(shí)現(xiàn)Runnable接口創(chuàng)建線(xiàn)程因?yàn)閖ava語(yǔ)言?xún)H支持單重繼承,所以當(dāng)定義線(xiàn)程需要繼承多個(gè)類(lèi)時(shí)用上述方法就無(wú)法實(shí)現(xiàn),這時(shí),就需要采取java提供另外一個(gè)定義線(xiàn)程方法----實(shí)現(xiàn)Runnable接口。它是在結(jié)構(gòu)線(xiàn)程過(guò)程中可能出現(xiàn)多重繼承問(wèn)題一個(gè)處理方案。實(shí)現(xiàn)Runnable接口類(lèi)就能夠成為線(xiàn)程,Thread類(lèi)就是因?yàn)閷?shí)現(xiàn)了Runnable接口所以才含有了線(xiàn)程功效Runnable接口位于java.lang包中,這個(gè)接口非常簡(jiǎn)單,僅定義了一個(gè)run()方法,接口定義以下:publicinterfaceRunnable{publicabstractvoidrun();}第39頁(yè)方法2:實(shí)現(xiàn)Runnable接口創(chuàng)建線(xiàn)程該接口只定義了一個(gè)方法run(),所以必須在新類(lèi)中實(shí)現(xiàn)它。不過(guò)Runnable接口并沒(méi)有任何對(duì)線(xiàn)程支持,我們還必須創(chuàng)建Thread類(lèi)實(shí)例,這一點(diǎn)經(jīng)過(guò)Thread類(lèi)結(jié)構(gòu)方法

publicThread(Runnabletarget);

來(lái)實(shí)現(xiàn)。

第40頁(yè)方法2:實(shí)現(xiàn)Runnable接口創(chuàng)建線(xiàn)程在java中,線(xiàn)程是一個(gè)對(duì)象,不是全部對(duì)象都能夠稱(chēng)為線(xiàn)程,只有實(shí)現(xiàn)了Runnable接口類(lèi)才能夠稱(chēng)為線(xiàn)程。實(shí)現(xiàn)Runnable接口創(chuàng)建新線(xiàn)程步驟以下:1.新建一個(gè)類(lèi),該類(lèi)實(shí)現(xiàn)了Runnable接口并重寫(xiě)run()方法。重寫(xiě)run()方法中包含要在新線(xiàn)程中運(yùn)行代碼。classMyRunnableimplementsRunnable{publicvoidrun(){//把你任務(wù)代碼寫(xiě)在這里}}第41頁(yè)方法2:實(shí)現(xiàn)Runnable接口創(chuàng)建線(xiàn)程2.在main()方法中使用剛才新編寫(xiě)類(lèi)創(chuàng)建Runnable接口類(lèi)型對(duì)象。MyRunnabler=newMyRunnable();3.在main()方法中創(chuàng)建一個(gè)Thread類(lèi)對(duì)象t,結(jié)構(gòu)方法參數(shù)就是第2步創(chuàng)建MyRunnable類(lèi)對(duì)象r,如:Threadt=newThread(r);第42頁(yè)方法2:實(shí)現(xiàn)Runnable接口創(chuàng)建線(xiàn)程4.為線(xiàn)程命名,如:t.setName(“我線(xiàn)程”);//可選5.調(diào)用Thread類(lèi)start()方法來(lái)運(yùn)行新線(xiàn)程。如:t.strat();經(jīng)過(guò)這種方法開(kāi)啟一個(gè)名為“我線(xiàn)程”線(xiàn)程,該線(xiàn)程執(zhí)行MyRunnable類(lèi)run方法中代碼。第43頁(yè)【例1】實(shí)現(xiàn)Runnable接口創(chuàng)建線(xiàn)程//創(chuàng)建兩個(gè)線(xiàn)程,讓其交替運(yùn)行publicclassthreadtest{publicstaticvoidmain(String[]args){computec=newcompute();compute1c1=newcompute1();Threadt=newThread(c);Threadt1=newThread(c1);t.start();t1.start();}}//這是一個(gè)線(xiàn)程類(lèi)//這個(gè)類(lèi)主要是用來(lái)經(jīng)過(guò)循環(huán)語(yǔ)句輸出數(shù)字classcomputeimplementsRunnable{publicvoidrun(){for(inti=0;i<10;i++){System.out.println(i);}}}//這是一個(gè)線(xiàn)程類(lèi)//這個(gè)類(lèi)主要是用來(lái)經(jīng)過(guò)循環(huán)語(yǔ)句輸出字符串語(yǔ)句classcompute1implementsRunnable{publicvoidrun(){for(inti=0;i<10;i++){System.out.println("這個(gè)數(shù)字是:"+i);}}}這個(gè)程序中,創(chuàng)建了2個(gè)線(xiàn)程,不過(guò)讀者屢次運(yùn)行程序后結(jié)果會(huì)不一樣。為何呢?因?yàn)樵诔绦蛑写嬖谝粋€(gè)執(zhí)行問(wèn)題,在java中,線(xiàn)程是搶占式地執(zhí)行,不需要時(shí)間片分配。第44頁(yè)【例2:(書(shū)例10-2)】實(shí)現(xiàn)Runnable接口創(chuàng)建線(xiàn)程publicclassMyThread2implementsRunnable{ intcount=1,number; publicMyThread2(inti) { number=i; System.out.println("創(chuàng)建線(xiàn)程"+number); } publicvoidrun() { while(true){ System.out.println("線(xiàn)程"+number+":計(jì)數(shù)"+count); if(++count==6){ return; } } } publicstaticvoidmain(Stringargs[]) { for(inti=0;i<5;i++) newThread(newMyThread2(i+1)).start(); }}第45頁(yè)【例3】實(shí)現(xiàn)Runnable接口創(chuàng)建線(xiàn)程classSimpleRunnableClassimplementsRunnable{ privateStringname; publicSimpleRunnableClass(Stringname){ =name; } publicvoidrun(){//線(xiàn)程要執(zhí)行邏輯操作

for(inti=0;i<10;i++){System.out.print();try{ Thread.sleep(1000);//睡眠1秒鐘,方便觀察線(xiàn)程執(zhí)行結(jié)果

}catch(InterruptedExceptione){ e.printStackTrace(); }}}}publicclassThreadDemo2{ publicstaticvoidmain(String[]args){ SimpleRunnableClassr1=newSimpleRunnableClass("張");//創(chuàng)建對(duì)象實(shí)例

SimpleRunnableClassr2=newSimpleRunnableClass("李"); SimpleRunnableClassr3=newSimpleRunnableClass("王"); Threadthread1=newThread(r1);//創(chuàng)建線(xiàn)程對(duì)象實(shí)例

Threadthread2=newThread(r2); Threadthread3=newThread(r3); thread1.start();//開(kāi)啟線(xiàn)程

thread2.start();//開(kāi)啟線(xiàn)程

thread3.start();//開(kāi)啟線(xiàn)程

}}第46頁(yè)兩種創(chuàng)建線(xiàn)程方法比較通常推薦使用實(shí)現(xiàn)Runnable接口創(chuàng)建線(xiàn)程方法,理由以下:Java僅支持單重繼承,一旦一個(gè)類(lèi)繼承了其它類(lèi),則不能繼承Thread類(lèi)。編寫(xiě)簡(jiǎn)單程序時(shí),能夠考慮使用繼承Thread類(lèi),因?yàn)閯?chuàng)建大量Thread類(lèi)對(duì)象,開(kāi)銷(xiāo)較大。第47頁(yè)方法3:經(jīng)過(guò)匿名類(lèi)創(chuàng)建線(xiàn)程有時(shí)候?yàn)榱朔奖悖軌蛑苯咏?jīng)過(guò)匿名類(lèi)方式創(chuàng)建線(xiàn)程,步驟以下:1.在根本程(main()方法)中,使用一個(gè)實(shí)現(xiàn)Runnable接口匿名派生類(lèi)對(duì)象為參數(shù),創(chuàng)建一個(gè)Thread對(duì)象,比如:

Threadthread1=newThread(newRunnable(){

publicvoidrun(){//線(xiàn)程要執(zhí)行邏輯操作

}});2.調(diào)用步驟1中創(chuàng)建Thread對(duì)象start()方法,以開(kāi)啟新線(xiàn)程,比如:thread1.start();第48頁(yè)例:經(jīng)過(guò)匿名類(lèi)創(chuàng)建線(xiàn)程publicclassThreadDemo3{publicstaticvoidmain(String[]args){ Threadthread1=newThread(newRunnable(){//創(chuàng)建線(xiàn)程對(duì)象實(shí)例(使用匿名對(duì)象)

publicvoidrun(){ for(inti=0;i<10;i++){ System.out.print(""+(int)(Math.random()*10));//打印隨機(jī)數(shù)

try{ Thread.sleep(1000);//睡眠1秒,方便觀察線(xiàn)程執(zhí)行結(jié)果

}catch(InterruptedExceptione){ e.printStackTrace(); }}}});thread1.start();//開(kāi)啟線(xiàn)程}}第49頁(yè)程序、進(jìn)程、線(xiàn)程多任務(wù)、多進(jìn)程、多線(xiàn)程

Java對(duì)多線(xiàn)程支持、Java根本程Java中創(chuàng)建線(xiàn)程方法線(xiàn)程休眠過(guò)程線(xiàn)程生命周期線(xiàn)程調(diào)度和優(yōu)先級(jí)內(nèi)容提要

第50頁(yè)線(xiàn)程休眠過(guò)程在Java中,休眠指是這么一個(gè)情況:線(xiàn)程在運(yùn)行過(guò)程中出于某種需要而“暫?!绷?,既不釋放已經(jīng)占用資源,也不會(huì)去占用處理機(jī),但并沒(méi)有消亡,這么線(xiàn)程需要某種條件或者一段時(shí)間才能夠接著重新占用處理機(jī)運(yùn)行。線(xiàn)程休眠使用Thread類(lèi)sleep()方法。publicstaticvoidsleep(long

millis)throwsInterruptedException

在指定毫秒數(shù)內(nèi)讓當(dāng)前正在執(zhí)行線(xiàn)程休眠(暫停執(zhí)行),此操作受到系統(tǒng)計(jì)時(shí)器和調(diào)度程序精度和準(zhǔn)確性影響。該線(xiàn)程不丟失任何監(jiān)視器所屬權(quán)。參數(shù):millis-以毫秒為單位休眠時(shí)間。拋出:InterruptedException-假如任何線(xiàn)程中止了當(dāng)前線(xiàn)程。當(dāng)拋出該異常時(shí),當(dāng)前線(xiàn)程中止?fàn)顟B(tài)被去除。第51頁(yè)線(xiàn)程休眠過(guò)程假如需要線(xiàn)程運(yùn)行過(guò)程中暫時(shí)休眠一段時(shí)間,能夠采取以下方法:在該線(xiàn)程run方法中添加:try {…//其它代碼

Thread.sleep(休眠時(shí)間,以毫秒為單位); …//其它代碼

}catch(InterruptedExceptione) { e.printStackTrace(); }課件中代碼:thread3.java和thread4.java第52頁(yè)程序、進(jìn)程、線(xiàn)程多任務(wù)、多進(jìn)程、多線(xiàn)程

Java對(duì)多線(xiàn)程支持、Java根本程Java中創(chuàng)建線(xiàn)程方法線(xiàn)程休眠過(guò)程線(xiàn)程生命周期線(xiàn)程調(diào)度和優(yōu)先級(jí)內(nèi)容提要

第53頁(yè)線(xiàn)程生命周期Java線(xiàn)程生命周期:線(xiàn)程從產(chǎn)生到消亡過(guò)程。一個(gè)線(xiàn)程在任何一個(gè)時(shí)刻都處于某種線(xiàn)程狀態(tài)。Java線(xiàn)程生命周期中一共有五個(gè)狀態(tài):①新建狀態(tài)②就緒狀態(tài)③運(yùn)行(執(zhí)行)狀態(tài)④阻塞狀態(tài)⑤終止?fàn)顟B(tài)(消亡)。下列圖是五個(gè)狀態(tài)狀態(tài)轉(zhuǎn)換示意圖:

新建狀態(tài)newThread(…)start()就緒狀態(tài)運(yùn)行狀態(tài)CPU調(diào)度yield()消亡run()結(jié)束stop()阻塞狀態(tài)I/Osleep()I/O完成sleep()時(shí)間到第54頁(yè)線(xiàn)程生命周期新建狀態(tài):新建狀態(tài)即創(chuàng)建一個(gè)新線(xiàn)程對(duì)象(newThread)。當(dāng)一個(gè)線(xiàn)程處于新建狀態(tài)時(shí),系統(tǒng)不為它分配CPU時(shí)間片等資源,沒(méi)有真正執(zhí)行它。新建線(xiàn)程代碼示例:

就緒狀態(tài):處于新建狀態(tài)線(xiàn)程被開(kāi)啟后,將進(jìn)入線(xiàn)程隊(duì)列排隊(duì)等候CPU時(shí)間片,此時(shí)它已經(jīng)具備了運(yùn)行條件。一旦輪到它來(lái)享用CPU資源時(shí),就能夠脫離創(chuàng)建它根本程獨(dú)立開(kāi)始自己生命周期了。另外原來(lái)處于阻塞狀態(tài)線(xiàn)程被解除阻塞后也將進(jìn)入就緒狀態(tài)。就緒狀態(tài)代碼示例:

ThreadmyThread=newThread();myThread.start();3132第55頁(yè)線(xiàn)程生命周期運(yùn)行狀態(tài)處于就緒狀態(tài)線(xiàn)程被調(diào)度并取得CUP處理后進(jìn)入了運(yùn)行狀態(tài),每一個(gè)Thread類(lèi)及其子類(lèi)對(duì)象都有一個(gè)run()方法,當(dāng)線(xiàn)程對(duì)象被調(diào)度執(zhí)行時(shí)候,它將自動(dòng)調(diào)用本對(duì)象run()方法,即正在運(yùn)行線(xiàn)程執(zhí)行是run方法中代碼。注意:對(duì)線(xiàn)程操作應(yīng)該寫(xiě)到run()方法中。33第56頁(yè)線(xiàn)程生命周期阻塞狀態(tài):一個(gè)正在執(zhí)行線(xiàn)程在一些特殊情況下,如被人為掛起或需要執(zhí)行費(fèi)時(shí)輸入輸出操作時(shí),將讓出CPU并暫時(shí)中止自己執(zhí)行,進(jìn)入阻塞狀態(tài)。阻塞時(shí)它不能進(jìn)入排隊(duì)隊(duì)列。只有當(dāng)引發(fā)阻塞原因被消除時(shí),線(xiàn)程才能夠轉(zhuǎn)入就緒狀態(tài),重新進(jìn)到線(xiàn)程隊(duì)列中排隊(duì)等候CPU資源,方便從原來(lái)終止處開(kāi)始繼續(xù)運(yùn)行。當(dāng)下面情況發(fā)生時(shí),線(xiàn)程就進(jìn)入阻塞狀態(tài):(1)調(diào)用了sleep()方法;(2)調(diào)用了suspend()方法;(3)為等候一個(gè)條件變量,線(xiàn)程調(diào)用wait()方法;(4)輸入/輸出(I/O)流中發(fā)生線(xiàn)程阻塞。當(dāng)發(fā)生以下情況之一時(shí),線(xiàn)程從阻塞狀態(tài)回到就緒狀態(tài):進(jìn)入睡眠狀態(tài)線(xiàn)程睡眠時(shí)間到線(xiàn)程等候I/O操作已經(jīng)完成線(xiàn)程正在等候被另一個(gè)線(xiàn)程占用“鎖”,該鎖已經(jīng)被釋放34第57頁(yè)線(xiàn)程生命周期終止?fàn)顟B(tài)當(dāng)run()方法執(zhí)行完成后,線(xiàn)程自動(dòng)消亡終止,當(dāng)Thread類(lèi)調(diào)用start()方法時(shí),Java虛擬機(jī)自動(dòng)調(diào)用它run()方法,而當(dāng)run()方法結(jié)束時(shí),該Thread會(huì)自動(dòng)終止。以前Thread類(lèi)中存在一個(gè)停頓線(xiàn)程stop()方法,不過(guò)它現(xiàn)在被廢棄了,因?yàn)檎{(diào)用這個(gè)方法,很輕易使程序進(jìn)入不穩(wěn)定狀態(tài)。35第58頁(yè)程序、進(jìn)程、線(xiàn)程多任務(wù)、多進(jìn)程、多線(xiàn)程

Java對(duì)多線(xiàn)程支持、Java根本程Java中創(chuàng)建線(xiàn)程方法線(xiàn)程休眠過(guò)程線(xiàn)程生命周期線(xiàn)程調(diào)度和優(yōu)先級(jí)內(nèi)容提要

第59頁(yè)線(xiàn)程調(diào)度和優(yōu)先級(jí)即使說(shuō)線(xiàn)程是并發(fā)運(yùn)行,然而事實(shí)經(jīng)常并非如此。當(dāng)系統(tǒng)中只有一個(gè)CPU時(shí),多個(gè)線(xiàn)程需要共享CPU,在任何時(shí)間點(diǎn)上實(shí)際只能有一個(gè)線(xiàn)程在運(yùn)行??刂贫鄠€(gè)線(xiàn)程在同一個(gè)CPU上以某種次序運(yùn)行稱(chēng)為線(xiàn)程調(diào)度。Java采取是一個(gè)簡(jiǎn)單、固定調(diào)度法,即固定優(yōu)先級(jí)調(diào)度(搶先式調(diào)度)。這種算法是依據(jù)處于可運(yùn)行狀態(tài)線(xiàn)程相對(duì)優(yōu)先級(jí)來(lái)實(shí)施調(diào)度。當(dāng)線(xiàn)程產(chǎn)生時(shí),它繼承原線(xiàn)程優(yōu)先級(jí),在需要時(shí)可對(duì)優(yōu)先級(jí)進(jìn)行修改。在任何時(shí)刻,假如有多條線(xiàn)程等候運(yùn)行,則系統(tǒng)選擇優(yōu)先級(jí)最高可運(yùn)行線(xiàn)程來(lái)運(yùn)行。只有當(dāng)它停頓、自動(dòng)放棄或因?yàn)槟撤N原因成為非運(yùn)行態(tài)時(shí),低優(yōu)先級(jí)線(xiàn)程才能運(yùn)行。假如兩個(gè)線(xiàn)程含有相同優(yōu)先級(jí),它們將被交替運(yùn)行。Java實(shí)時(shí)系統(tǒng)線(xiàn)程調(diào)度算法還是強(qiáng)制性,在任何時(shí)刻,假如一個(gè)比其它線(xiàn)程優(yōu)先級(jí)都高線(xiàn)程狀態(tài)變?yōu)榭蛇\(yùn)行狀態(tài),則實(shí)時(shí)系統(tǒng)將選擇該線(xiàn)程進(jìn)行運(yùn)行。第60頁(yè)線(xiàn)程調(diào)度和優(yōu)先級(jí)線(xiàn)程執(zhí)行是一個(gè)搶占方式,優(yōu)先級(jí)高比優(yōu)先級(jí)低要取得更多執(zhí)行時(shí)間,假如想讓一個(gè)線(xiàn)程比其它線(xiàn)程有更多時(shí)間運(yùn)行,能夠經(jīng)過(guò)設(shè)置線(xiàn)程優(yōu)先級(jí)處理。如一個(gè)線(xiàn)程創(chuàng)建后,能夠經(jīng)過(guò)在線(xiàn)程中調(diào)用setPriority()方法來(lái)設(shè)置其優(yōu)先級(jí),詳細(xì)方法以下:publicfinalvoidsetPriority(intnewPriority)newPriority是一個(gè)1-10之間正整數(shù),數(shù)值越大,優(yōu)先級(jí)越高,系統(tǒng)有一些常數(shù)值:1.MAX_PRIORITY:最高優(yōu)先級(jí)(值為10)2.MIN_PRIORITY:最低優(yōu)先級(jí)(值為1)3.NORM_PRIORITY:默認(rèn)優(yōu)先級(jí)(值為5)(一個(gè)線(xiàn)程對(duì)象被創(chuàng)建時(shí)默認(rèn)優(yōu)先級(jí))線(xiàn)程創(chuàng)建時(shí),繼承了父線(xiàn)程優(yōu)先級(jí)。父線(xiàn)程是指執(zhí)行創(chuàng)建新線(xiàn)程對(duì)象語(yǔ)句線(xiàn)程,它可能是根本程,也可能是用戶(hù)自己定義線(xiàn)程。普通情況下,根本程含有默認(rèn)優(yōu)先級(jí)。在線(xiàn)程創(chuàng)建之后,能夠經(jīng)過(guò)getPriority()方法得到線(xiàn)程優(yōu)先級(jí),也能夠經(jīng)過(guò)setPriority()方法改變線(xiàn)程優(yōu)先級(jí)。第61頁(yè)課件中代碼:thread2.java線(xiàn)程優(yōu)先級(jí)第62頁(yè)線(xiàn)程優(yōu)先級(jí)假如沒(méi)有優(yōu)先級(jí)要求,線(xiàn)程執(zhí)行次序是隨機(jī),普通根

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論