Java Web 開發(fā)課件:多線程_第1頁
Java Web 開發(fā)課件:多線程_第2頁
Java Web 開發(fā)課件:多線程_第3頁
Java Web 開發(fā)課件:多線程_第4頁
Java Web 開發(fā)課件:多線程_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

多線程回顧在網(wǎng)絡(luò)上,使用IP地址來區(qū)分每一臺主機(jī),而端口則允許一臺主機(jī)上可以有多個程序?qū)W(wǎng)絡(luò)進(jìn)行通訊;包中包含了一系列用于網(wǎng)絡(luò)通信的類;InetAddress類的對象用于描述主機(jī)地址;Socket套接字封裝了兩臺主機(jī)之間的連接,可以通過操作它來達(dá)到網(wǎng)絡(luò)通訊的目地;ServerSocket可以偵聽來自客戶端的請求,從來創(chuàng)建與客戶端通訊的Socket。本章目標(biāo)多線程的概念在Java中實現(xiàn)多線程Thread類Runnable接口線程的生命周期和線程狀態(tài)后臺線程線程同步與死鎖本章相關(guān)詞匯單詞說明thread線,線程runnable可追捕的,可獵取的current當(dāng)前的,最近的sleep睡,睡眠yield屈服,屈從interrupted中斷的,被阻止的daemon后臺程序wait等待,等候notify通報synchronized同步的多任務(wù)當(dāng)今的操作系統(tǒng)絕大部分都是基于多任務(wù)的操作系統(tǒng);多任務(wù)操作系統(tǒng)的最大特點,是可以同時運行多個程序;由于操作系統(tǒng)支持時間片輪換算法,使得用戶感覺多個程序在同時運行,似乎有多個CPU在起作用。線程的概念運行在操作系統(tǒng)之上的每個應(yīng)用程序,都會占用一個獨立的進(jìn)程(process),而進(jìn)程內(nèi)又允許運行多個線程(thread),這意味著一個程序可以同時執(zhí)行多個任務(wù)的功能;在基于線程的多任務(wù)而處理環(huán)境中,線程是執(zhí)行特定任務(wù)的可執(zhí)行代碼的最小單位;多線程幫助你寫出CPU最大利用率的高效程序,因為空閑時間保持最低,這對Java運行的交互式的網(wǎng)絡(luò)互連環(huán)境是至關(guān)重要的,例如:網(wǎng)絡(luò)的數(shù)據(jù)傳輸速率遠(yuǎn)低于計算機(jī)的處理能力,在傳統(tǒng)的單線程環(huán)境中,你的計算機(jī)必須花費大量的空閑時間來等待,多線程能夠使你充分利用這些空閑時間。進(jìn)程與線程的區(qū)別進(jìn)程是指系統(tǒng)中正在運行中的應(yīng)用程序,它擁有自己獨立的內(nèi)存空間;線程是指進(jìn)程中一個執(zhí)行流程,一個進(jìn)程中允許同時啟動多個線程,他們分別執(zhí)行不同的任務(wù);線程與進(jìn)程的主要區(qū)別在于:每個進(jìn)程都需要操作系統(tǒng)為其分配獨立的內(nèi)存地址空間,而同一進(jìn)程中的所有線程在同一塊地址空間中,這些線程可以共享數(shù)據(jù),因此線程間的通信比較簡單,消耗的系統(tǒng)開銷也相對較小。多線程Java支持編寫多線程的程序;多線程最大的好處在于可以同時并發(fā)執(zhí)行多個任務(wù),當(dāng)程序的某個功能部分正在等待某些資源的時候,此時又不愿意因為等待而造成程序暫停,那么就可以創(chuàng)建另外的線程進(jìn)行其它的工作;多線程可以最大限度地減低CPU的閑置時間,從而提高CPU的利用率;Java對多線程的支持在Java中實現(xiàn)線程有兩種方式,分別是:擴(kuò)展java.lang.Thread類實現(xiàn)java.lang.Runnable接口9Thread類中的常用靜態(tài)方法java.lang.Thread類用于創(chuàng)建和操作線程,其中包括幾個很重要的靜態(tài)方法,用于控制當(dāng)前線程:10方法原型說明staticThreadcurrentThread()返回對當(dāng)前正在執(zhí)行的線程對象的引用staticvoidsleep(longmillis)throwsInterruptedException讓當(dāng)前正在執(zhí)行的線程休眠(暫停執(zhí)行),休眠時間由millis(毫秒)指定staticvoidsleep(longmillis,intnanos)throwsInterruptedException讓當(dāng)前正在執(zhí)行的線程休眠,休眠時間由millis(毫秒)和nanos(納秒)指定staticvoidyield()暫停當(dāng)前正在執(zhí)行的線程,轉(zhuǎn)而執(zhí)行其它的線程staticbooleaninterrupted()判斷當(dāng)前線程是否已經(jīng)中斷主線程任何一個Java程序啟動時,一個線程立刻運行,它執(zhí)行main方法,這個線程稱為程序的主線程;也就是說,任何Java程序都至少有一個線程,即主線程;主線程的特殊之處在于:它是產(chǎn)生其它線程子線程的線程;通常它必須最后結(jié)束,因為它要執(zhí)行其它子線程的關(guān)閉工作。11主線程示例12public

classMainThreadDemo{

public

static

voidmain(String[]args){

//獲得當(dāng)前運行的線程

ThreadtMain=Thread.currentThread();System.out.println("當(dāng)前運行的線程是:"+tMain);

try{

for(inti=0;i<5;i++){System.out.println(i);Thread.sleep(2000);//使當(dāng)前線程休眠2秒

}}

catch(java.lang.InterruptedExceptionie){ie.printStackTrace();}}}線程別名線程優(yōu)先級線程學(xué)名自定義線程在Java中要實現(xiàn)線程,最簡單的方式就是擴(kuò)展Thread類,重寫其中的run方法,方法原型如下:

public

voidrun()如:

publicclassMyThreadextendsThread{ publicvoidrun(){ …… } }Thread類中的run方法本身并不執(zhí)行任何操作,如果我們重寫了run方法,當(dāng)線程啟動時,它將執(zhí)行run方法。13Thread類的構(gòu)造方法Thread類共提供8種構(gòu)造方法重載,以下是常用的幾種:14構(gòu)造方法說明Thread()創(chuàng)建一個新的線程Thread(Stringname)創(chuàng)建一個指定名稱的線程Thread(Runnabletarget)利用Runnable對象創(chuàng)建一個線程,啟動時將執(zhí)行該對象的run方法Thread(Runnabletarget,Stringname)利用Runnable對象創(chuàng)建一個線程,并指定該線程的名稱Thread類的常用方法15方法原型說明voidstart()啟動線程finalvoidsetName(Stringname)設(shè)置線程的名稱finalStringgetName()返回線程的名稱finalvoidsetPriority(intnewPriority)設(shè)置線程的優(yōu)先級finalintgetPriority()返回線程的優(yōu)先級案例:泡茶16classBoilThreadextendsThread{//燒開水的線程

public

void

run(){

try{System.out.println("開始燒水...");Thread.sleep(10000);//假設(shè)燒水需要10秒

System.out.println("水燒開了。");}catch(InterruptedExceptionie){ie.printStackTrace();}}}classWashThreadextendsThread{//洗茶杯的線程

public

voidrun(){

try{

for(inti=1;i<=5;i++){//洗5個茶杯

System.out.print("開始洗第"+i+"個茶杯...");Thread.sleep(1500);//假設(shè)每洗一個茶杯需要1.5秒

System.out.println("第"+i+"個茶杯洗干凈。");}}catch(InterruptedExceptionie){ie.printStackTrace();}}}public

classMakeTea{

public

static

voidmain(String[]args){

newBoilThread().start();//啟動燒水線程

newWashThread().start();//啟動洗茶杯線程

}}Runnable接口java.lang.Runnable接口中僅僅只有一個抽象方法:

public

voidrun();也可以通過實現(xiàn)Runnable接口的方式來實現(xiàn)線程,只需要實現(xiàn)其中的run方法即可;Runnable接口的存在主要是為了解決Java中不允許多繼承的問題;使用Runnable接口可以使語法的自由度更高。17案例:時鐘18classShowDateLabelextendsJLabelimplementsRunnable{//實現(xiàn)Runnable接口

private

intsleepTime;//休眠時間

publicShowDateLabel(intsleepTime){

this.sleepTime=sleepTime;

newThread(this).start();//啟動線程

}

public

voidrun(){//實現(xiàn)Runnable接口中的run方法

try{

while(true){

this.setText(newDate().toString());//顯示當(dāng)前時間

Thread.sleep(sleepTime);}}catch(InterruptedExceptionie){ie.printStackTrace();}}}public

classClockFrameextendsJFrame{

publicClockFrame(){Containercp=this.getContentPane();cp.setLayout(newGridLayout(3,1));cp.add(newShowDateLabel(1000));cp.add(newShowDateLabel(3000));cp.add(newShowDateLabel(5000));……}}線程優(yōu)先級事實上,計算機(jī)只有一個CPU,各個線程輪流獲得CPU的使用權(quán),才能執(zhí)行任務(wù);優(yōu)先級較高的線程有更多獲得CPU的機(jī)會,反之亦然;優(yōu)先級用整數(shù)表示,取值范圍是1~10,一般情況下,線程的默認(rèn)優(yōu)先級都是5,但是也可以通過setPriority和getPriority方法來設(shè)置或返回優(yōu)先級;Thread類有如下3個靜態(tài)常量來表示優(yōu)先級:

MAX_PRIORITY:取值為10,表示最高優(yōu)先級

MIN_PRIORITY:取值為1,表示最底優(yōu)先級

NORM_PRIORITY:取值為5,表示默認(rèn)的優(yōu)先級19線程優(yōu)先級示例20classMyThreadimplementsRunnable{//自定義線程,實現(xiàn)Runnable接口

public

void

run(){StringstrName=Thread.currentThread().getName();

for(inti=0;i<50;i++){System.out.println(strName+":"+i);}}}public

classThreadPriority{

public

static

voidmain(String[]args){

//三個線程

Threadt1=newThread(newMyThread());//第一個自定義線程

Threadt2=newThread(newMyThread());//第二個自定義線程

Threadtm=Thread.currentThread();//獲得當(dāng)前線程,即主線程

t1.setName(("t1");t2.setName(("t2");tm.setName("tm");//分別設(shè)置線程的名稱

t1.setPriority(Thread.MAX_PRIORITY);//設(shè)置線程的優(yōu)先級

t2.setPriority(Thread.MIN_PRIORITY);System.out.println(t1.getName()+"的優(yōu)先級:"+t1.getPriority());System.out.println(t2.getName()+"的優(yōu)先級:"+t2.getPriority());System.out.println(tm.getName()+"的優(yōu)先級:"+tm.getPriority());t1.start();t2.start();StringstrName=tm.getName();

for(inti=0;i<50;i++){System.out.println(strName+":"+i);}}}線程的生命周期線程在它的生命周期中會處于不同的狀態(tài):21新線程(新建)就緒運行死亡等待阻塞start()系統(tǒng)調(diào)度run()方法執(zhí)行完畢睡眠掛起sleep()或join()或等待IO同步鎖notify()或interupt()解鎖線程狀態(tài)新建狀態(tài)(New):使用new關(guān)鍵字創(chuàng)建線程對象,僅僅被分配了內(nèi)存;就緒狀態(tài)(Ready):線程對象被創(chuàng)建后,等待它的start方法被調(diào)用,以獲得CPU的使用權(quán);運行狀態(tài)(Running):執(zhí)行run方法,此時的線程的對象正占用CPU;睡眠狀態(tài)(Sleeping):調(diào)用sleep方法,線程被暫停,睡眠時間結(jié)束后,線程回到就緒狀態(tài),睡眠狀態(tài)的線程不占用CPU;死亡狀態(tài)(Dead):run方法執(zhí)行完畢后,線程進(jìn)入死亡狀態(tài);阻塞狀態(tài)(Blocked):線程由于某些事件(如等待鍵盤輸入)放棄CPU,暫停運行,直到線程重新進(jìn)入就緒狀態(tài),才有機(jī)會轉(zhuǎn)到運行狀態(tài);22與線程狀態(tài)相關(guān)的一些方法23方法原型說明finalvoidjoin()throwsInterruptedException等待線程終止finalboolean

isAlive()判斷線程是否處于活動狀態(tài)voidinterrupt()中斷線程voiddestro

溫馨提示

  • 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

提交評論