java高級(jí)編程2課件_第1頁(yè)
java高級(jí)編程2課件_第2頁(yè)
java高級(jí)編程2課件_第3頁(yè)
java高級(jí)編程2課件_第4頁(yè)
java高級(jí)編程2課件_第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、Java多線程第1頁(yè),共22頁(yè)。Java 線程模型理解線程概念 進(jìn)程的概念線程的概念線程與進(jìn)程的區(qū)別和聯(lián)系一個(gè)進(jìn)程在其執(zhí)行過程中,可以產(chǎn)生多個(gè)線程。在進(jìn)程概念中,每一個(gè)進(jìn)程的內(nèi)部數(shù)據(jù)和狀態(tài)都是完全獨(dú)立的。但與進(jìn)程不同的是,同類的多個(gè)線程是共享一塊內(nèi)存空間和一組系統(tǒng)資源,而線程本身的數(shù)據(jù)通常只有微處理器的寄存器數(shù)據(jù),以及一個(gè)供程序執(zhí)行時(shí)使用的堆棧。 第2頁(yè),共22頁(yè)。線程是比進(jìn)程更小的執(zhí)行單位,是進(jìn)程內(nèi)部獨(dú)立的,有序的指令流。由此,一個(gè)進(jìn)程能包含多個(gè)并發(fā)執(zhí)行的線程。線程是一種能夠獨(dú)立運(yùn)行的子任務(wù)。多線程是一種允許在程序中并發(fā)執(zhí)行彼此間互相獨(dú)立的多個(gè)線程機(jī)制。多個(gè)線程的執(zhí)行是并發(fā)的。多個(gè)線程之間的

2、代碼是亂序執(zhí)行的,由此線程調(diào)度,同步等問題需要進(jìn)行特殊處理。第3頁(yè),共22頁(yè)。1. 線程的生命周期線程的5種狀態(tài)及轉(zhuǎn)換方法 新生態(tài)Now Bron運(yùn)行態(tài)Running可運(yùn)行態(tài)Runnable阻塞態(tài)Blocked死亡態(tài)Deadsuspend()sleep()wait()resume()notify()start()yield()stop()stop()stop()第4頁(yè),共22頁(yè)。1. 新生狀態(tài)當(dāng)利用new運(yùn)算符創(chuàng)建線程對(duì)象實(shí)例后,它僅僅作為一個(gè)對(duì)象實(shí)例存在,JVM沒有為其分配CPU時(shí)間片等線程運(yùn)行資源,該線程處于新生狀態(tài)。2. 可運(yùn)行狀態(tài)在處于新生狀態(tài)的線程中調(diào)用start()方法將線程的狀態(tài)

3、轉(zhuǎn)換為可運(yùn)行狀態(tài)。這時(shí),線程已經(jīng)得到除CPU時(shí)間之外的其它系統(tǒng)資源,只等JVM的線程調(diào)度管理器按照線程的優(yōu)先級(jí)對(duì)該線程進(jìn)行調(diào)度,從而使該線程擁有能夠獲得CPU時(shí)間片的機(jī)會(huì)。3. 運(yùn)行狀態(tài)JVM的線程調(diào)度管理器選中一個(gè)可運(yùn)行狀態(tài)線程,使其占有CPU并轉(zhuǎn)換為運(yùn)行狀態(tài)。運(yùn)行狀態(tài)的線程執(zhí)行自己的run()方法中的代碼,直到調(diào)用其他方法而終止、或等待某資源而阻塞或完成任務(wù)而死亡。第5頁(yè),共22頁(yè)。4. 睡眠狀態(tài)處于運(yùn)行狀態(tài)的線程在某些情況下,如執(zhí)行了sleep()方法,或等待I/O設(shè)備等資源,將讓出CPU并暫時(shí)終止自己的運(yùn)行,進(jìn)入阻塞狀態(tài),也稱為不可運(yùn)行狀態(tài)。處于阻塞狀態(tài)的線程是不可執(zhí)行的,即使CPU空

4、閑,也不能執(zhí)行。只有當(dāng)引起阻塞的原因被消除時(shí),線程轉(zhuǎn)入可運(yùn)行狀態(tài),重新進(jìn)入線程隊(duì)列中排隊(duì)等待運(yùn)行,再次運(yùn)行時(shí)從原來終止處繼續(xù)運(yùn)行。5. 死亡狀態(tài)死亡狀態(tài)是線程生命周期中的最后一個(gè)階段。導(dǎo)致線程死亡的有2種情況:一是正常運(yùn)行的線程完成了它的全部工作,這個(gè)任務(wù)完成的動(dòng)作是由run()方法實(shí)現(xiàn)的;另一個(gè)是線程被強(qiáng)制性地終止,如通過執(zhí)行stop()方法來終止一個(gè)線程??梢杂胕sAlive()方法測(cè)試線程是否已啟動(dòng)。如果isAlive()方法返回false,表示該線程是新創(chuàng)建或已被終止;如果返回true,表示該線程已啟動(dòng)且未被終止,是可運(yùn)行狀態(tài)、運(yùn)行狀態(tài)或阻塞狀態(tài)之一,但不能作進(jìn)一步的分辨。第6頁(yè),共2

5、2頁(yè)。2. 線程控制(1) start()方法start()方法對(duì)應(yīng)于啟動(dòng)操作(2) stop()方法stop()方法終止在任何狀態(tài)的線程,使之轉(zhuǎn)入到死亡狀態(tài) (3) sleep()方法sleep()方法使線程暫停運(yùn)行一段固定的時(shí)間。在休眠時(shí)間內(nèi),由于線程不能得到CPU 時(shí)間而不運(yùn)行,指定的時(shí)間一過,線程重新進(jìn)入可運(yùn)行狀態(tài)。public static void sleep(longmillis) throws InterruptedExceptionpublic static void sleep(longmillis, intnanos) throws InterruptedExceptio

6、n(4) yield()方法yield()方法使得線程放棄當(dāng)前分得的CPU時(shí)間,但是不使線程阻塞,即線程仍處于可運(yùn)行狀態(tài),隨時(shí)可能再次分得CPU時(shí)間 第7頁(yè),共22頁(yè)。(5) wait()方法wait()方法使得當(dāng)前線程進(jìn)入阻塞狀態(tài),直到被喚醒或等夠了timeout指定的時(shí)間。注意:wait()等價(jià)于wait(0),它使得線程永遠(yuǎn)等待直到被喚醒為止。 public final void wait(longtimeout) throws InterruptedExceptionpublic final void wait(longtimeout, intnanos) throws Interru

7、ptedExceptionpublic final void wait() throws InterruptedException(6) notify()方法和notifyAll()方法notify()方法和notifyAll()方法對(duì)應(yīng)于喚醒操作。(7) suspend()方法和resume()方法suspend()方法和resume()方法配套使用,suspend()方法使得線程進(jìn)入阻塞狀態(tài),并且不會(huì)自動(dòng)恢復(fù),必須其對(duì)應(yīng)的resume()方法被調(diào)用,才能使得線程重新進(jìn)入可執(zhí)行狀態(tài)。 第8頁(yè),共22頁(yè)。(8) interrupt()方法和interrupted()方法 interrupt()

8、方法為線程設(shè)置一個(gè)中斷標(biāo)記,以便于run()方法運(yùn)行時(shí)使用isInterrupted()方法能夠檢測(cè)到,此時(shí),線程在sleep()之類的方法中被阻塞時(shí),由sleep()方法拋出一個(gè)InterruptedException異常,然后捕獲這個(gè)異常以處理超時(shí)。(9) isAlive()方法 isAlive()方法用來判斷一個(gè)線程的run()方法是否還在執(zhí)行,如果是在運(yùn)行,則返回true,否則返回false。第9頁(yè),共22頁(yè)。3. 線程的創(chuàng)建在Java中創(chuàng)建線程的方法有2種:一是通過創(chuàng)建Thread類的子類來實(shí)現(xiàn),二是通過實(shí)現(xiàn)Runnable接口的類來實(shí)現(xiàn)。用繼承Thread類的子類或通過實(shí)現(xiàn)Runn

9、able接口的類來創(chuàng)建線程無本質(zhì)的區(qū)別。但是由于Java語言不允許多重繼承,所以,如果類已經(jīng)繼承了別的類,這樣它就不能再繼承Thread了。這時(shí),就要用Runnable接口的方式。 第10頁(yè),共22頁(yè)。(1)Thread類與Runnable接口Thread類用于創(chuàng)建和控制線程。一個(gè)線程必須從run()方法開始執(zhí)行,而run()方法聲明在java.lang.Runnable接口中。Runnable接口中只聲明了一個(gè)run()方法。任何實(shí)現(xiàn)Runnable接口的對(duì)象都可以作為一個(gè)線程的目標(biāo)對(duì)象。一個(gè)線程對(duì)象必須實(shí)現(xiàn)run()方法來完成線程的所有活動(dòng),已實(shí)現(xiàn)的run()方法稱為該對(duì)象的線程體。 第1

10、1頁(yè),共22頁(yè)。Thread類在java.lang包中定義,Thread類的構(gòu)造方法如下:(1) Thread ()(2) Thread (Runnabletarget)(3) Thread (Runnabletarget, Stringname)(4) Thread (Stringname)(5) Thread (ThreadGroupgroup, Runnabletarget)(6) Thread (ThreadGroupgroup, Runnabletarget, Stringname)(7) Thread (ThreadGroupgroup, Stringname)任何實(shí)現(xiàn)Runabl

11、e接口的對(duì)象對(duì)可以作為Thread類構(gòu)造方法中的target參數(shù),而Thread類本身也實(shí)現(xiàn)了Runable接口。因此,可以有2種方式提供run()方法來實(shí)現(xiàn)多線程。第12頁(yè),共22頁(yè)。(2)繼承Thread類實(shí)現(xiàn)多線程Thread類是一個(gè)具體的類,即不是抽象類,該類封裝了線程的行為。要?jiǎng)?chuàng)建一個(gè)線程:Thread類包含了線程運(yùn)行所需要的方法,當(dāng)一個(gè)類繼承了Thread類后就可以在重寫父類中的run()方法來執(zhí)行指定的操作。需要注意的是線程子類的對(duì)象需要通過調(diào)用自己的start()方法讓線程執(zhí)行,start()方法會(huì)自動(dòng)調(diào)用run()方法。 。 第13頁(yè),共22頁(yè)。例 通過繼承Thread實(shí)現(xiàn)多

12、線程public class SimpleThread extends Thread int count= 1, number; public SimpleThread(int num) number = num; System.out.println(創(chuàng)建線程 + number); public void run() while(true) System.out.println(線程 + number + :計(jì)數(shù) + count); if(+count= 4) return; public static void main(String args) for(int i = 0; i 3; i

13、+) new SimpleThread(i+1).start(); 第14頁(yè),共22頁(yè)。(3)通過Runnable接口實(shí)現(xiàn)多線程 用Runnable接口創(chuàng)建線程 實(shí)現(xiàn)線程的另外一種方法是通過使用Thread類的一個(gè)構(gòu)造方法public Thread(Runnable target)來創(chuàng)建一個(gè)新的線程 ,其中創(chuàng)建參數(shù)target的類負(fù)責(zé)實(shí)現(xiàn)Runnable接口。 Runnable接口中只有一個(gè)run( )方法,實(shí)現(xiàn)該接口的類必須實(shí)現(xiàn)接口中的run( )方法,在其中定義具體操作,然后將實(shí)現(xiàn)了Runnable接口的類的對(duì)象作為參數(shù)創(chuàng)建一個(gè)Thread類的對(duì)象,調(diào)用該Thread類對(duì)象的start(

14、)方法啟動(dòng)線程。 第15頁(yè),共22頁(yè)。例 通過實(shí)現(xiàn)Runnable接口實(shí)現(xiàn)多線程public class Runnable1 implements Runnable int k=0; public Runnable1(int k) this.k = k; public void run() int i = k; while (i50) System.out.print(i+ ); i+=2; public static void main (String args) Runnable1 r1 = new Runnable1(1); /創(chuàng)建具有線程體的目標(biāo)對(duì)象 Runnable1 r2 = ne

15、w Runnable1(2); Thread t1=new Thread(r1); /以目標(biāo)對(duì)象創(chuàng)建線程 Thread t2=new Thread(r2); t1.start(); t2.start(); for (int i=0;i40;i+) System.out.print(A ); 第16頁(yè),共22頁(yè)。兩種線程實(shí)現(xiàn)方式的對(duì)比分析 通過繼承Thread類來實(shí)現(xiàn)多線程的編程這種方法簡(jiǎn)單明了,但是它也有一個(gè)很大的缺點(diǎn),那就是如果相應(yīng)的多線程處理類已經(jīng)繼承了一個(gè)類,便無法再繼承Thread這個(gè)類,所以我們一般情況下采用Runnable接口的方法來實(shí)現(xiàn)多線程的編程。使用Runnable接口的來實(shí)

16、現(xiàn)多線程在開發(fā)過程中能夠在一個(gè)類中包容所有的代碼,以便封裝。但是使用Runnable接口的方法的缺點(diǎn)在于如果想創(chuàng)建多個(gè)線程并使各個(gè)線程執(zhí)行不同的的代碼,就必須創(chuàng)建額外的類,這樣的話在某些情況下不如直接用多個(gè)類分別繼承Thread緊湊。第17頁(yè),共22頁(yè)。18線程的優(yōu)先級(jí)線程的優(yōu)先級(jí)用數(shù)字來表示,范圍從1到10,即Thread.MIN_PRIORITY到Thread.MAX_PRIORITY。一個(gè)線程的缺省優(yōu)先級(jí)是5,即Thread.NORM_PRIORITY。int getPriority();void setPriority(int newPriority);第18頁(yè),共22頁(yè)。19clas

17、s ThreadTest public static void main( String args ) Thread t1 = new MyThread(T1); t1.setPriority( Thread.MIN_PRIORITY ); t1.start( ); Thread t2 = new MyThread(T2); t2.setPriority( Thread.MAX_PRIORITY ); t2.start( ); Thread t3 = new MyThread(T3); t3.setPriority( Thread.MAX_PRIORITY ); t3.start( ); 第19頁(yè),共22頁(yè)。20class MyThread extends Thread String message; MyThread ( String message

溫馨提示

  • 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)論