java高級編程2課件_第1頁
java高級編程2課件_第2頁
java高級編程2課件_第3頁
java高級編程2課件_第4頁
java高級編程2課件_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

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

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

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

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

6、n(4) yield()方法yield()方法使得線程放棄當(dāng)前分得的CPU時間,但是不使線程阻塞,即線程仍處于可運行狀態(tài),隨時可能再次分得CPU時間 第7頁,共22頁。(5) wait()方法wait()方法使得當(dāng)前線程進入阻塞狀態(tài),直到被喚醒或等夠了timeout指定的時間。注意:wait()等價于wait(0),它使得線程永遠等待直到被喚醒為止。 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()方法對應(yīng)于喚醒操作。(7) suspend()方法和resume()方法suspend()方法和resume()方法配套使用,suspend()方法使得線程進入阻塞狀態(tài),并且不會自動恢復(fù),必須其對應(yīng)的resume()方法被調(diào)用,才能使得線程重新進入可執(zhí)行狀態(tài)。 第8頁,共22頁。(8) interrupt()方法和interrupted()方法 interrupt()

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

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

10、1頁,共22頁。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)任何實現(xiàn)Runabl

11、e接口的對象對可以作為Thread類構(gòu)造方法中的target參數(shù),而Thread類本身也實現(xiàn)了Runable接口。因此,可以有2種方式提供run()方法來實現(xiàn)多線程。第12頁,共22頁。(2)繼承Thread類實現(xiàn)多線程Thread類是一個具體的類,即不是抽象類,該類封裝了線程的行為。要創(chuàng)建一個線程:Thread類包含了線程運行所需要的方法,當(dāng)一個類繼承了Thread類后就可以在重寫父類中的run()方法來執(zhí)行指定的操作。需要注意的是線程子類的對象需要通過調(diào)用自己的start()方法讓線程執(zhí)行,start()方法會自動調(diào)用run()方法。 。 第13頁,共22頁。例 通過繼承Thread實現(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 + :計數(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頁,共22頁。(3)通過Runnable接口實現(xiàn)多線程 用Runnable接口創(chuàng)建線程 實現(xiàn)線程的另外一種方法是通過使用Thread類的一個構(gòu)造方法public Thread(Runnable target)來創(chuàng)建一個新的線程 ,其中創(chuàng)建參數(shù)target的類負責(zé)實現(xiàn)Runnable接口。 Runnable接口中只有一個run( )方法,實現(xiàn)該接口的類必須實現(xiàn)接口中的run( )方法,在其中定義具體操作,然后將實現(xiàn)了Runnable接口的類的對象作為參數(shù)創(chuàng)建一個Thread類的對象,調(diào)用該Thread類對象的start(

14、)方法啟動線程。 第15頁,共22頁。例 通過實現(xiàn)Runnable接口實現(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)對象 Runnable1 r2 = ne

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

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

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論