版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第九講多線程第1頁,共72頁,2023年,2月20日,星期三第九講JAVA多線程機(jī)制9.7在同步方法中使用wait()、notify
和notifyAll()方法9.8掛起、恢復(fù)和終止線程9.9計(jì)時(shí)器線程Timer9.10線程聯(lián)合9.11守護(hù)線程第2頁,共72頁,2023年,2月20日,星期三第九講JAVA多線程機(jī)制教學(xué)目的:學(xué)習(xí)java中線程的使用,掌握線程的調(diào)度和控制方法,清楚地理解多線程的互斥和同步的實(shí)現(xiàn)原理,以及多線程的應(yīng)用。掌握線程之間的相互調(diào)度關(guān)系,尤其是通過線程睡眠來使其它線程獲得執(zhí)行機(jī)會(huì)的機(jī)制,以及互斥和同步的實(shí)現(xiàn)機(jī)制。第3頁,共72頁,2023年,2月20日,星期三第九講JAVA多線程機(jī)制教學(xué)內(nèi)容:
1.線程的基本概念;
2.線程的狀態(tài)與生命周期;
3.線程的創(chuàng)建;
4.線程的調(diào)度與線程控制;
5.線程同步等相關(guān)內(nèi)容。重點(diǎn)及難點(diǎn)
1.多線程的調(diào)度和控制。
2.多線程的互斥和同步。第4頁,共72頁,2023年,2月20日,星期三9.1Java中的線程一、程序、進(jìn)程、線程簡(jiǎn)介
1、程序:
是用某種語言編寫的、完成特定任務(wù)的、一組指令的集合。指一段靜態(tài)的代碼。
2、進(jìn)程:
進(jìn)程是程序的一次動(dòng)態(tài)執(zhí)行過程,它對(duì)應(yīng)了從代碼加載、執(zhí)行至執(zhí)行完畢的一個(gè)完整過程,這個(gè)過程也是進(jìn)程本身從產(chǎn)生、發(fā)展至消亡的過程。線程是比進(jìn)程更小的執(zhí)行單位,一個(gè)進(jìn)程在其執(zhí)行過程中,可以產(chǎn)生多個(gè)線程,形成多條執(zhí)行線索,每條線索,即每個(gè)線程也有它自身的產(chǎn)生、存在和消亡的過程,也是一個(gè)動(dòng)態(tài)的概念。第5頁,共72頁,2023年,2月20日,星期三
3、線程:是進(jìn)程中的一個(gè)實(shí)體,是被系統(tǒng)獨(dú)立調(diào)度和分派的基本單位,線程自己基本不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(如:程序計(jì)數(shù)器,一組寄存器和棧)執(zhí)行就緒等待CPU掛起第6頁,共72頁,2023年,2月20日,星期三9.1Java中的線程4、進(jìn)程與線程的區(qū)別1)線程的劃分尺度小于進(jìn)程。2)多個(gè)線程是共享內(nèi)存單元的,而進(jìn)程在執(zhí)行過程中擁有自己獨(dú)立的內(nèi)存單元。3)線程自己基本不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源,而進(jìn)程要運(yùn)行必須獲得有可能需要的所有資源。第7頁,共72頁,2023年,2月20日,星期三9.1Java中的線程5、線程的調(diào)度方法1)調(diào)度策略時(shí)間片輪轉(zhuǎn)式搶占式:高優(yōu)先級(jí)的線程搶占CPU2)Java的調(diào)度方法對(duì)高優(yōu)先級(jí),使用優(yōu)先調(diào)度的搶占式策略。同優(yōu)先級(jí)線程,使用時(shí)間片策略。12第8頁,共72頁,2023年,2月20日,星期三9.1Java中的線程
二、線程的狀態(tài)與生命周期
要想實(shí)現(xiàn)線程,必須在主線程中創(chuàng)建新的線程對(duì)象,在線程的一個(gè)完整的生命周期中通常要經(jīng)歷如下的五種狀態(tài):1、新建:當(dāng)一個(gè)線程剛創(chuàng)建時(shí)的狀態(tài)。2、就緒:處于新建狀態(tài)的線程被啟動(dòng)后的狀態(tài)。第9頁,共72頁,2023年,2月20日,星期三9.1Java中的線程
3、運(yùn)行:當(dāng)就緒的線程被調(diào)度并獲得CPU時(shí)的狀態(tài)。
4、阻塞:在某種特殊情況下,被人為掛起或執(zhí)行輸入輸出操作時(shí),讓出CPU臨時(shí)中止自己的執(zhí)行,進(jìn)入的狀態(tài)。
5、死亡:線程完成了它的全部工作自動(dòng)終止或線程被提前強(qiáng)制性地中止的狀態(tài)。(stop()或destroy())第10頁,共72頁,2023年,2月20日,星期三線程的生命周期圖第11頁,共72頁,2023年,2月20日,星期三線程的狀態(tài)轉(zhuǎn)移圖CPU調(diào)度
I/O完成sleep時(shí)間到新建狀態(tài)newThread(..)就緒狀態(tài)start()等待狀態(tài)執(zhí)行狀態(tài)I/Osleep()run()結(jié)束stop()yield()消亡第12頁,共72頁,2023年,2月20日,星期三9.1Java中的線程三、啟動(dòng)線程線程創(chuàng)建后僅僅是占有了內(nèi)存資源,在JVM管理的線程中還沒有這個(gè)線程,此線程必須調(diào)用start()方法(從父類繼承的方法)通知JVM,這樣JVM就會(huì)知道又有一個(gè)新一個(gè)線程排隊(duì)等候切換了。第13頁,共72頁,2023年,2月20日,星期三例9.1publicclassExample9_1{publicstaticvoidmain(Stringargs[]){Lefthandleft;Righthandright;left=newLefthand();//創(chuàng)建線程
right=newRighthand();left.start();right.start();for(inti=1;i<=6;i++){System.out.println("我是主線程");}}}第14頁,共72頁,2023年,2月20日,星期三classLefthandextendsThread{publicvoidrun(){for(inti=1;i<=9;i++){System.out.println("我是左手線程");}}}第15頁,共72頁,2023年,2月20日,星期三classRighthandextendsThread{publicvoidrun(){for(inti=1;i<=9;i++){System.out.println("我是右手線程");}}}第16頁,共72頁,2023年,2月20日,星期三9.2Java中線程的實(shí)現(xiàn)
Java的線程是通過java.lang.Thread類來實(shí)現(xiàn)的。當(dāng)我們生成一個(gè)Thread類的對(duì)象之后,一個(gè)新的線程就產(chǎn)生了。而每個(gè)線程都是通過類Thread(在Java的軟件包Java.lang中定義)的構(gòu)造方法創(chuàng)建的。構(gòu)造方法如下:
publicThread(ThreadGroupgroup,Runnabletarget,Stringname);第17頁,共72頁,2023年,2月20日,星期三9.2Java中線程的實(shí)現(xiàn)當(dāng)上述構(gòu)造方法的某個(gè)參數(shù)為null時(shí),我們可得到下面的幾個(gè)構(gòu)造方法:publicThread();publicThread(Runnabletarget);publicThread(Runnabletarget,Stringname);publicThread(Stringname);publicThread(ThreadGroupgroup,Runnabletarget);publicThread(ThreadGroupgroup,Stringname);第18頁,共72頁,2023年,2月20日,星期三9.2Java中線程的實(shí)現(xiàn)
一、線程的創(chuàng)建方法(一)Thread的子類創(chuàng)建線程
1)定義一個(gè)線程類,它繼承線程類Thread2)重寫其中的方法run()。這時(shí)在初始化這個(gè)類的實(shí)例時(shí),目標(biāo)target可為null,表示由這個(gè)實(shí)例對(duì)象來執(zhí)行線程體。第19頁,共72頁,2023年,2月20日,星期三9.2Java中線程的實(shí)現(xiàn)3)方法說明:編寫Thread類的子類時(shí),需要重寫父類的run方法,其目的是規(guī)定線程的具體操作,否則線程就什么也不做,因?yàn)楦割惖膔un方法中沒有任何操作語句。當(dāng)JVM將CPU使用權(quán)切換給線程時(shí),如果線程是Thread的子類創(chuàng)建的,該類中的run方法就立刻執(zhí)行。第20頁,共72頁,2023年,2月20日,星期三例9.2publicclassExample9_2{publicstaticvoidmain(Stringargs[]){Peopleteacher,student;ComputerSumsum=newComputerSum();teacher=newPeople("老師",200,sum);student=newPeople("學(xué)生",200,sum);teacher.start();student.start();}}第21頁,共72頁,2023年,2月20日,星期三classComputerSum{intsum;publicvoidsetSum(intn){sum=n;}publicintgetSum(){returnsum;}}第22頁,共72頁,2023年,2月20日,星期三classPeopleextendsThread{inttimeLength;//線程休眠的時(shí)間長(zhǎng)度
ComputerSumsum;People(Strings,inttimeLength,ComputerSumsum){setName(s);//調(diào)用Thread類的方法
setName為線程起個(gè)名字
this.timeLength=timeLength;this.sum=sum;}第23頁,共72頁,2023年,2月20日,星期三publicvoidrun(){for(inti=1;i<=5;i++){intm=sum.getSum();sum.setSum(m+1);System.out.println(“我是”+getName()+“,現(xiàn)在的和:"+sum.getSum());try{sleep(timeLength);}catch(InterruptedExceptione){}}}}第24頁,共72頁,2023年,2月20日,星期三9.2Java中線程的實(shí)現(xiàn)(二)使用Runable接口
1)定義一個(gè)類,實(shí)現(xiàn)Runnable接口,并overriderun()方法,而run()中是你希望這個(gè)線程運(yùn)行的代碼;
2)創(chuàng)建這個(gè)新類的對(duì)象;
3)創(chuàng)建一個(gè)Thread類的對(duì)象,用剛才的Runnable對(duì)象作為構(gòu)造函數(shù)的參數(shù);
4)調(diào)用Thread對(duì)象的start()方法來啟動(dòng)線程。第25頁,共72頁,2023年,2月20日,星期三9.2Java中線程的實(shí)現(xiàn)5)方法說明創(chuàng)建線程的另一個(gè)途徑就是用Thread類直接創(chuàng)建線程對(duì)象。使用Thread創(chuàng)建線程對(duì)象時(shí),通常使用的構(gòu)造方法是:
Thread(Runnabletarget)該構(gòu)造方法中的參數(shù)是一個(gè)Runnable類型的接口,因此,在創(chuàng)建線程對(duì)象時(shí)必須向構(gòu)造方法的參數(shù)傳遞一個(gè)實(shí)現(xiàn)Runnable接口類的實(shí)例,該實(shí)例對(duì)象稱作所創(chuàng)線程的目標(biāo)對(duì)象。當(dāng)線程調(diào)用start方法后,一旦輪到它來享用CPU資源,目標(biāo)對(duì)象就會(huì)自動(dòng)調(diào)用接口中的run方法(接口回調(diào))。
第26頁,共72頁,2023年,2月20日,星期三例9.3publicclassExample9_3{publicstaticvoidmain(Stringargs[]){Bankbank=newBank();//線程的目標(biāo)對(duì)象設(shè)置被線程共享的moneybank.setMoney(300);bank.會(huì)計(jì).start();bank.出納.start();}}第27頁,共72頁,2023年,2月20日,星期三classBankimplementsRunnable{privateintmoney=0;Thread會(huì)計(jì),出納;Bank(){會(huì)計(jì)=newThread(this);
會(huì)計(jì).setName("會(huì)計(jì)");
出納=newThread(this);//會(huì)計(jì)和出納的目標(biāo)對(duì)象相同出納.setName("出納");}publicvoidsetMoney(intmount){money=mount;}第28頁,共72頁,2023年,2月20日,星期三publicvoidrun()//接口中的方法
{while(true){money=money-50;if(Thread.currentThread()==會(huì)計(jì)){System.out.println(“我是”+會(huì)計(jì).getName()+"現(xiàn)在有:"+money+"元");if(money<=150){System.out.println(會(huì)計(jì).getName()+"進(jìn)入死亡狀態(tài)");return;//如果money少于50,會(huì)計(jì)的run方法結(jié)束
}}
第29頁,共72頁,2023年,2月20日,星期三elseif(Thread.currentThread()==出納){System.out.println("我是"+
出納.getName()+"現(xiàn)在有:"+money+"元");if(money<=0)return;//如果money少于0,出納的run方法結(jié)束
}try{Thread.sleep(800);}catch(InterruptedExceptione){}}}}第30頁,共72頁,2023年,2月20日,星期三9.3線程的調(diào)度
JAVA中線程的優(yōu)先級(jí)用數(shù)字來表示,范圍從1到10,即Thread.MIN_PRIORITY到Thread.MAX_PRIORITY。一個(gè)線程的缺省優(yōu)先級(jí)是Thread.NORM_PRIORITY。下述方法可以對(duì)優(yōu)先級(jí)進(jìn)行操作:
intgetPriority();//得到線程的優(yōu)先級(jí)
voidsetPriority(intnewPriority);//當(dāng)線程被創(chuàng)建后,可通過此方法改變線程的優(yōu)先級(jí)第31頁,共72頁,2023年,2月20日,星期三9.4線程的常用方法
1、start()
線程調(diào)用該方法將啟動(dòng)線程,使之從新建狀態(tài)進(jìn)入就緒隊(duì)列排隊(duì),一旦輪到它來享用CPU資源時(shí),就可以脫離創(chuàng)建它的線程獨(dú)立開始自己的生命周期了。
2、run()Thread類的run()方法與Runnable接口中的run()方法的功能和作用相同,都用來定義線程對(duì)象被調(diào)度之后所執(zhí)行的操作,都是系統(tǒng)自動(dòng)調(diào)用而用戶程序不得引用的方法。系第32頁,共72頁,2023年,2月20日,星期三9.4線程的常用方法系統(tǒng)的Thread類中,run()方法沒有具體內(nèi)容,所以用戶程序需要?jiǎng)?chuàng)建自己的Thread類的子類,并重寫run()方法來覆蓋原來的run()方法。當(dāng)run方法執(zhí)行完畢,線程就變成死亡狀態(tài)。
3、sleep(intmillsecond)
線程占有CPU期間,執(zhí)行sleep方法來使自己放棄CPU資源,休眠一段時(shí)間。休眠時(shí)間的長(zhǎng)短由sleep方法的參數(shù)決定,millsecond是毫秒為單位的休眠時(shí)間。如果線程在休眠時(shí)被打斷,JVM就拋出InterruptedException異常。第33頁,共72頁,2023年,2月20日,星期三9.4線程的常用方法
4、isAlive()
線程處于“新建”狀態(tài)時(shí),線程調(diào)用isAlive()方法返回false。當(dāng)一個(gè)線程調(diào)用start()方法,并占有CPU資源后,該線程的run方法就開始運(yùn)行,在線程的run方法結(jié)束之前,即沒有進(jìn)入死亡狀態(tài)之前,線程調(diào)用isAlive()方法返回true。當(dāng)線程進(jìn)入“死亡”狀態(tài)后(實(shí)體內(nèi)存被釋放),線程仍可以調(diào)用方法isAlive(),這時(shí)返回的值是false。第34頁,共72頁,2023年,2月20日,星期三例9.8importjava.util.*;publicclassExample9_8{publicstaticvoidmain(Stringargs[]){Aa=newA();a.thread.start();}}第35頁,共72頁,2023年,2月20日,星期三classAimplementsRunnable{Threadthread;intn=0;A(){thread=newThread(this);}第36頁,共72頁,2023年,2月20日,星期三
publicvoidrun(){while(true){System.out.println(newDate());n++;try{Thread.sleep(1000);}catch(InterruptedExceptione){}if(n==3){thread=newThread(this);thread.start();}if(n>=12)return;}}}第37頁,共72頁,2023年,2月20日,星期三9.4線程的常用方法
5、currentThread()
currentThread()方法是Thread類中的類方法,可以用類名調(diào)用,該方法返回當(dāng)前正在使用CPU資源的線程。
6、interrupt()
intertupt方法經(jīng)常用來“吵醒”休眠的線程。當(dāng)一些線程調(diào)用sleep方法處于休眠狀態(tài)時(shí),一個(gè)占有CPU資源的線程可以讓休眠的線程調(diào)用interrupt方法“吵醒”自己。第38頁,共72頁,2023年,2月20日,星期三例9.9publicclassExample9_9{publicstaticvoidmain(Stringargs[]){Aa=newA();a.student.start();a.teacher.start();}}第39頁,共72頁,2023年,2月20日,星期三classAimplementsRunnable{Threadstudent,teacher;A(){teacher=newThread(this);student=newThread(this);teacher.setName("王教授");student.setName("張三");}第40頁,共72頁,2023年,2月20日,星期三publicvoidrun(){if(Thread.currentThread()==student){try{System.out.println(student.getName()+"正在睡覺,不聽課");
Thread.sleep(1000*60*60);}catch(InterruptedExceptione){System.out.println(student.getName()+"被老師叫醒了");}System.out.println(student.getName()+"開始聽課");}第41頁,共72頁,2023年,2月20日,星期三elseif(Thread.currentThread()==teacher){for(inti=1;i<=3;i++){System.out.println("上課!");try{Thread.sleep(500);}catch(InterruptedExceptione){}}
errupt();//吵醒student}}}第42頁,共72頁,2023年,2月20日,星期三9.5GUI線程程序包含圖形用戶界面(GUI)時(shí),Java虛擬機(jī)在運(yùn)行應(yīng)用程序時(shí)會(huì)自動(dòng)啟動(dòng)更多的線程,其中有兩個(gè)重要的線程:AWT-EventQuecue和AWT-Windows。AWT-EventQuecue-()線程負(fù)責(zé)處理GUI事件,AWT-Windows線程負(fù)責(zé)將窗體或組件繪制到桌面。第43頁,共72頁,2023年,2月20日,星期三9.6線程同步一、線程同步問題線程同步是指幾個(gè)線程都需要調(diào)用一個(gè)同步方法(使用關(guān)鍵字synchronized修飾的方法)。前面所提到的線程都是獨(dú)立的,而且異步執(zhí)行,也就是說每個(gè)線程都包含了運(yùn)行時(shí)所需要的數(shù)據(jù)或方法,而不需要外部的資源或方法,也不必關(guān)心其它線程的狀態(tài)或行為。但是經(jīng)常有一些同時(shí)運(yùn)行的線程需要共享數(shù)據(jù),此時(shí)就需考慮其他線程的狀態(tài)和行為,否則就不能保證程序的運(yùn)行結(jié)果的正確性。
第44頁,共72頁,2023年,2月20日,星期三9.6線程同步二、同步機(jī)制當(dāng)一個(gè)線程A使用一個(gè)synchronized修飾的方法時(shí),其他線程想使用這個(gè)方法時(shí)就必須等待,直到線程A使用完該方法(除非線程A使用wait主動(dòng)讓出CPU資源)。格式1:synchronized方法名{…}
格式2:方法名{
synchronized(this){…}….}第45頁,共72頁,2023年,2月20日,星期三例9.13
publicsynchronizedvoid存取(intnumber)//存取方法
{if(Thread.currentThread()==會(huì)計(jì)){text1.append("今天是星期"+weekDay+"\n");for(inti=1;i<=3;i++)//會(huì)計(jì)使用存取方法存入90元,存入30元,稍歇一下
{money=money+number;//這時(shí)出納仍不能使用存取方法
try{Thread.sleep(1000);//因?yàn)闀?huì)計(jì)還沒使用完存取方法
}catch(InterruptedExceptione){}text1.append("帳上有"+money+"萬\n");}}第46頁,共72頁,2023年,2月20日,星期三
elseif(Thread.currentThread()==出納){text2.append("今天是星期"+weekDay+"\n");for(inti=1;i<=2;i++)//出納使用存取方法取
//出30元,取出15元,稍歇一下
{money=money-number/2;//這時(shí)會(huì)計(jì)仍不能使用存取方法
try{Thread.sleep(1000);//因?yàn)槌黾{還沒使用完存取方法
}catch(InterruptedExceptione){}text2.append("帳上有"+money+"萬\n");}}}第47頁,共72頁,2023年,2月20日,星期三publicvoidrun(){if(Thread.currentThread()==會(huì)計(jì)
||Thread.currentThread()==出納){for(inti=1;i<=3;i++)//從周一到周三會(huì)計(jì)
//和出納都要使用帳本
{weekDay=i;
存取(30);}}}第48頁,共72頁,2023年,2月20日,星期三9.7在同步方法中使用wait()、notify和notifyAll()方法
wait()與notify()是Object類的方法它們的定義為:publicfinalvoidwait():令當(dāng)前線程掛起并放棄管程,同步資源解鎖,使別的線程可訪問并修改共享資源,而當(dāng)前線程排隊(duì)等候再次對(duì)資源的訪問notify():喚醒正在排隊(duì)等待資源管程的線程中優(yōu)先級(jí)最高者,使之執(zhí)行并擁有資源的管程。第49頁,共72頁,2023年,2月20日,星期三9.7在同步方法中使用wait()、notify和notifyAll()方法一個(gè)線程在使用的同步方法中時(shí),可能根據(jù)問題的需要,必須使用wait()方法使本線程等待,暫時(shí)讓出CPU的使用權(quán),并允許其它線程使用這個(gè)同步方法。其它線程如果在使用這個(gè)同步方法時(shí)如果不需要等待,那么它用完這個(gè)同步方法的同時(shí),應(yīng)當(dāng)執(zhí)行notifyAll()方法通知所有的由于使用這個(gè)同步方法而處于等待的線程結(jié)束等待。第50頁,共72頁,2023年,2月20日,星期三9.7在同步方法中使用wait()、notify和notifyAll()方法1)publicfinalvoidwait()方法在當(dāng)前線程中調(diào)用方法:對(duì)象名.wait()使當(dāng)前線程進(jìn)入等待(某對(duì)象)狀態(tài),直到另一線程對(duì)該對(duì)象發(fā)出notify(或notifyAll)為止。調(diào)用方法的必要條件:當(dāng)前線程必須具有對(duì)該對(duì)象的監(jiān)控權(quán)(加鎖)當(dāng)前線程將釋放對(duì)象監(jiān)控權(quán),然后進(jìn)入等待隊(duì)列(wait隊(duì)列)。在當(dāng)前線程被notify后,要重新獲得監(jiān)控權(quán),然后從斷點(diǎn)處繼續(xù)代碼的執(zhí)行。第51頁,共72頁,2023年,2月20日,星期三9.7在同步方法中使用wait()、notify和notifyAll()方法2)publicfinalvoidnotify()
方法在當(dāng)前線程中調(diào)用方法:對(duì)象名.notify()功能:?jiǎn)拘训却搶?duì)象監(jiān)控權(quán)的一個(gè)線程。調(diào)用方法的必要條件:當(dāng)前線程必須具有對(duì)該對(duì)象的監(jiān)控權(quán)(加鎖)。第52頁,共72頁,2023年,2月20日,星期三例9.14Thread張平,李明;publicvoidactionPerformed(ActionEvente){try{張平.start();
李明.start();}catch(Exceptionexp){}}第53頁,共72頁,2023年,2月20日,星期三publicvoidrun(){if(Thread.currentThread()==張平){王小姐.售票規(guī)則(20);}elseif(Thread.currentThread()==李明){王小姐.售票規(guī)則(5);}}第54頁,共72頁,2023年,2月20日,星期三class售票員{int五元錢的個(gè)數(shù)=2,十元錢的個(gè)數(shù)=0,二十元錢的個(gè)數(shù)=0;Strings=null;publicsynchronizedvoid售票規(guī)則(intmoney){if(money==5)//如果使用該方法的線程傳遞的參數(shù)是5,就不用等待
{五元錢的個(gè)數(shù)=五元錢的個(gè)數(shù)+1;s="給您入場(chǎng)卷您的錢正好";MyFrame.text.append("\n"+s);}
第55頁,共72頁,2023年,2月20日,星期三elseif(money==20){while(五元錢的個(gè)數(shù)<3){try{wait();
//如果使用該方法的線程傳遞的參數(shù)是20須等待
}catch(InterruptedExceptione){}}
五元錢的個(gè)數(shù)=五元錢的個(gè)數(shù)-3;
二十元錢的個(gè)數(shù)=二十元錢的個(gè)數(shù)+1;s="給您入場(chǎng)卷"+"您給我20,找您15元";MyFrame.text.append("\n"+s);}
notifyAll();}}第56頁,共72頁,2023年,2月20日,星期三9.8掛起、恢復(fù)和終止線程
1、掛起程序運(yùn)行時(shí),有時(shí)候兩個(gè)線程并不是同步的,即不涉及都需要調(diào)用一個(gè)同步方法,但線程也可能需要暫時(shí)的掛起。所謂掛起一個(gè)線程就是讓線程暫時(shí)讓出CPU的使用權(quán)限,暫時(shí)停止執(zhí)行,但停止執(zhí)行的持續(xù)時(shí)間不確定,因此不能使用sleep方法暫停線程。掛起一個(gè)線程需使用wait方法,即讓準(zhǔn)備掛起的線程調(diào)用wait方法,主動(dòng)讓出CPU的使用權(quán)限。第57頁,共72頁,2023年,2月20日,星期三9.8掛起、恢復(fù)和終止線程
2、恢復(fù)
為了恢復(fù)某個(gè)線程,其它線程在占有CUP資源期間,讓掛起的線程的目標(biāo)對(duì)象執(zhí)行notifyAll()方法,使得掛起的線程繼續(xù)執(zhí)行;如果線程沒有目標(biāo)對(duì)象,為了恢復(fù)該線程,其它線程在占有CPU資源期間,讓掛起的線程調(diào)用notifyAll()方法,使掛起的線程繼續(xù)執(zhí)行。第58頁,共72頁,2023年,2月20日,星期三9.8掛起、恢復(fù)和終止線程
3、終止線程
1)線程執(zhí)行完其run()方法后,會(huì)自然終止。
2)通過調(diào)用線程的實(shí)例方法stop()來終止線程。第59頁,共72頁,2023年,2月20日,星期三9.9計(jì)時(shí)器線程Timer使用Timer類的構(gòu)造方法:Timer(inta,Objectb)創(chuàng)建一個(gè)計(jì)時(shí)器。參數(shù)a的單位是豪秒,確定計(jì)時(shí)器每隔a毫秒“震鈴”一次,參數(shù)b是計(jì)時(shí)器的監(jiān)視器。計(jì)時(shí)器發(fā)生的震鈴事件是ActinEvent類型事件。當(dāng)震鈴事件發(fā)生時(shí),監(jiān)視器就會(huì)監(jiān)視到這個(gè)事件,就會(huì)執(zhí)行接口ActionListener中的方法:actionPerformed(Actionevente)。
使用Timer類的start()方法啟動(dòng)計(jì)時(shí)器,即啟動(dòng)線程。使用stop()方法停止計(jì)時(shí)器,即掛起線程,使用restart()方法重新啟動(dòng)計(jì)時(shí)器,即恢復(fù)線程。第60頁,共72頁,2023年,2月20日,星期三例9.18importjavax.swing.Timer;Timertime;time=newTimer(1000,this);//TimeWin對(duì)象做計(jì)時(shí)器的監(jiān)視器第61頁,共72頁,2023年,2月20日,星期三publicvoidactionPerformed(ActionEvente){if(e.getSource()==time){java.util.Datedate=newjava.util.Date();Stringstr=date.toString().substring(11,19);text.setText("時(shí)間:"+str);intx=text.getBounds().x;inty=text.getBounds().y;y=y+2;text.setLocation(x,y);}第62頁,共72頁,2023年,2月20日,星期三
elseif(e.getSource()==bStart){time.start();}elseif(e.getSource()==bStop){time.stop();
}elseif(e.getSource()==bContinue){time.restart();
}}第63頁,共72頁,2023年,2月20日,星期三9.10線程聯(lián)合一個(gè)線程A在占有CPU資源期間,可以讓其它線程調(diào)用join()和本線程聯(lián)合.如果線程A在占有CPU資源期間一旦聯(lián)合B線程,那么A線程將立刻中斷執(zhí)行,一直等到它聯(lián)合的線程B執(zhí)行完畢,A線程再重新排隊(duì)等待CPU資源,以便恢復(fù)執(zhí)行。第64頁,共72頁,2023年,2月20日,星期三9.10線程聯(lián)合當(dāng)前線程等待調(diào)用該方法的線程結(jié)束后,再恢復(fù)執(zhí)行。
MyThreadtt=newMyThread(100);
tt.start();
…
publicvoidtimeout(){
tt.join();//當(dāng)前線程等待線程tt
//執(zhí)行完后再繼續(xù)往下執(zhí)行
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度年福建省高校教師資格證之高等教育心理學(xué)通關(guān)提分題庫(kù)及完整答案
- 2024年度年福建省高校教師資格證之高等教育學(xué)模擬預(yù)測(cè)參考題庫(kù)及答案
- 五年級(jí)數(shù)學(xué)(小數(shù)乘法)計(jì)算題專項(xiàng)練習(xí)及答案匯編
- 2024年化工技術(shù)研發(fā)人員勞務(wù)協(xié)議
- 品創(chuàng)業(yè)案例分析
- 2024混凝土施工承攬協(xié)議樣本
- 清明節(jié)主題班會(huì)課件
- 2024年房屋建筑施工協(xié)議樣本
- 彩鋼建筑租賃協(xié)議格式2024年
- 2024民間資金出借協(xié)議簡(jiǎn)明
- GA 667-2020防爆炸透明材料
- 小學(xué)三年級(jí)下冊(cè)綜合實(shí)踐活動(dòng).奇妙的水果-(16張)ppt
- 介紹南充特色文化課件
- 中醫(yī)病歷書寫基本規(guī)范
- 擠出機(jī)螺桿組合原理和應(yīng)用教育課件
- 五年級(jí)上冊(cè)美術(shù)《船》-課件
- 健康教育學(xué)【完整版】課件
- 發(fā)動(dòng)機(jī)大修過程檢驗(yàn)單
- 新開課程申請(qǐng)表(模板)
- 讀后續(xù)寫專題野外遇險(xiǎn)兩篇學(xué)案-高考英語復(fù)習(xí)作文備考
- 裝修改造工程施工勞動(dòng)力計(jì)劃及機(jī)械設(shè)備配置
評(píng)論
0/150
提交評(píng)論