資源描述:
《《java程序設計》課件 第14章多線程.ppt》由會員上傳分享,免費在線閱讀,更多相關內容在教育資源-天天文庫。
1、第十四章多線程14-1Java的多線程機制多線程機制是Java語言的又一重要特征,使用多線程技術可以使系統(tǒng)同時運行多個執(zhí)行體,這樣可以加快程序的響應時間,提高計算機資源的利用率。使用多線程技術可以提高整個應用系統(tǒng)的性能。14-1-1線程的生命周期每個Java程序都有一個主線程,即main()方法對應的線程。要實現多線程,必須在主線程中創(chuàng)建新的線程。在Java語言中,線程用Thread類及其子類的對象來表示。每個線程要經歷由“新生?就緒?運行?阻塞?死亡”5種狀態(tài),線程從新生到死亡的狀態(tài)變化過程稱為生命周期。線程
2、的生命周期新生就緒阻塞運行死亡1.新生狀態(tài)用new關鍵字和Thread類或其子類建立一個線程對象后,該線程對象就處于新生狀態(tài)。處于新生狀態(tài)的線程有自己的內存空間,通過調用start方法進入就緒狀態(tài)。2.就緒狀態(tài)處于就緒狀態(tài)的線程已經具備了運行條件,但還沒有分配到CPU,因而將進入線程隊列,等待系統(tǒng)為其分配CPU。一旦獲得CPU,線程就進入運行狀態(tài)并自動調用自己的run方法。3.運行狀態(tài)在運行狀態(tài)的線程執(zhí)行自己的run方法中代碼,直到調用其他方法而終止、或等待某資源而阻塞或完成任務而死亡。4.阻塞狀態(tài)處于運行狀態(tài)
3、的線程在某些情況下,如執(zhí)行了sleep(睡眠)方法,或等待I/O設備等資源,將讓出CPU并暫時終止自己的運行,進入阻塞狀態(tài)。在阻塞狀態(tài)的線程不能進入就緒隊列。只有當引起阻塞的原因消除時,如睡眠時間已到,或等待的I/O設備空閑下來,線程便轉入就緒狀態(tài),重新到就緒隊列中排隊等待CPU資源。當再次獲得CPU時,便從原來終止位置開始繼續(xù)運行。5.死亡狀態(tài)死亡狀態(tài)是線程生命周期中的最后一個階段。線程死亡的原因有兩個。一個是正常運行的線程完成了它的全部工作;另一個是線程被強制性地終止,如通過執(zhí)行stop或destroy方法
4、來終止一個線程。14-1-2多線程的實現方法在Java中,創(chuàng)建線程的方法有兩種:通過創(chuàng)建Thread類的子類來實現;通過實現Runnable接口的類來實現。14-2通過Thread類實現多線程通過繼承Thread類實現多線程的方法是首先設計Thread的子類,然后根據工作需要重新設計線程的run方法,再使用start方法啟動線程,將執(zhí)行權轉交到run。Java實例—通過Thread類//通過繼承Thread類實現多線程classThread1extendsThread{Strings;intm,count=0;
5、Thread1(Stringss,intmm){s=ss;m=mm;}publicvoidrun(){try{while(true){System.out.print(s);sleep(m);count++;Java實例——(續(xù))if(count>=20)break;}System.out.println(s+"finished!");}catch(InterruptedExceptione){return;}}publicstaticvoidmain(Stringargs[]){Thread1threadA=
6、newThread1("A",50);Thread1threadB=newThread1("B",100);threadA.start();threadB.start();}}運行該程序的輸出結果如下所示:ABABAABAABAABAABAABAABAABAABAABAfinished!BBBBBBBBBBfinished!14-3通過Runnable接口實現多線程通過Runnable接口實現多線程的方法:設計一個實現Runnable接口的類,然后根據工作需要重新設計線程的run方法;建立該類的對象,以此對象為
7、參數建立Thread類的對象;調用Thread類對象的start方法啟動線程,將執(zhí)行權轉交到run方法。Java實例——通過Runnable接口//通過Runnable接口實現多線程classThread2implementsRunnable{Strings;intm,count=0;Thread2(Stringss,intmm){s=ss;m=mm;}publicvoidrun(){try{while(true){System.out.print(s);Thread.sleep(m);if(++count>=
8、20)break;}Java實例——(續(xù))System.out.println(s+"hasfinished!");}catch(InterruptedExceptione){return;}}publicstaticvoidmain(Stringargs[]){Thread2threadA=newThread2("A",50);Thread2threadB=newThread2("B