第七章Java的多線程程序設(shè)計_第1頁
第七章Java的多線程程序設(shè)計_第2頁
第七章Java的多線程程序設(shè)計_第3頁
第七章Java的多線程程序設(shè)計_第4頁
第七章Java的多線程程序設(shè)計_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第七章第七章 JavaJava的多線程程序設(shè)計的多線程程序設(shè)計 7.1 7.1 線程的概念線程的概念7.1.1 7.1.1 進程和線程進程和線程 進程是一個具有一定獨立功能的程序在一個數(shù)據(jù)進程是一個具有一定獨立功能的程序在一個數(shù)據(jù)集合上的一次動態(tài)執(zhí)行過程。進程是存儲器、外設(shè)集合上的一次動態(tài)執(zhí)行過程。進程是存儲器、外設(shè)等資源的分配單位。也是處理器的調(diào)度對象。等資源的分配單位。也是處理器的調(diào)度對象。 但每個進程有自己獨立的內(nèi)存空間和資源,進程但每個進程有自己獨立的內(nèi)存空間和資源,進程之間不會共享系統(tǒng)資源。之間不會共享系統(tǒng)資源。線程就是比進程更小的運行單位,一個進程可以線程就是比進程更小的運行單位,

2、一個進程可以被劃分成多個線程。在一個支持線程的系統(tǒng)中,線被劃分成多個線程。在一個支持線程的系統(tǒng)中,線程是處理器的調(diào)度對象。程是處理器的調(diào)度對象。一個進程中的線程共享進程的資源。線程之間的通一個進程中的線程共享進程的資源。線程之間的通信要比進程之間的通信方便。信要比進程之間的通信方便。7.1.2線程和多任務(wù)線程和多任務(wù)(multi task) 多任務(wù)是指在系統(tǒng)中可以同時運行多個程序,如果多任務(wù)是指在系統(tǒng)中可以同時運行多個程序,如果只有一個處理器,在每一時刻只有一個進程的一條指只有一個處理器,在每一時刻只有一個進程的一條指令被執(zhí)行??梢允惯@些任務(wù)交替執(zhí)行,由于間隔的時令被執(zhí)行??梢允惯@些任務(wù)交替執(zhí)

3、行,由于間隔的時間短,這些程序看上去好像在同時運行。間短,這些程序看上去好像在同時運行。 如果將進程再劃分成進線程,每個線程輪流占用處如果將進程再劃分成進線程,每個線程輪流占用處理器,可以減少并發(fā)控制的時間理器,可以減少并發(fā)控制的時間 。 windows98/NT/2000操作系統(tǒng)就是將進程劃分為線程操作系統(tǒng)就是將進程劃分為線程來支持多任務(wù)的并發(fā)處理。來支持多任務(wù)的并發(fā)處理。7.1.3 Java對多線程的支持對多線程的支持Java通過對通過對Thread類的繼承或?qū)︻惖睦^承或?qū)unnable接口的實接口的實現(xiàn),實現(xiàn)多線程編程?,F(xiàn),實現(xiàn)多線程編程。7.2 7.2 線程的創(chuàng)建線程的創(chuàng)建 為了將進

4、程劃分成線程,要在程序中創(chuàng)建多個線程對為了將進程劃分成線程,要在程序中創(chuàng)建多個線程對象。象。ThreadThread類用來創(chuàng)建和控制線程。一個線程要從類用來創(chuàng)建和控制線程。一個線程要從runrun方方法開始執(zhí)行,法開始執(zhí)行,runrun方法的聲明在方法的聲明在java.lang.java.lang.RunnableRunnable接接口中。口中。每個程序至少有一個主線程每個程序至少有一個主線程。 7.2.1 7.2.1 RunnableRunnable接口接口 在在RunnableRunnable中,只聲明了一個方法中,只聲明了一個方法runrun public void run( ); pu

5、blic void run( ); 已實現(xiàn)的已實現(xiàn)的runrun方法稱為該對象的線程體。方法稱為該對象的線程體。 在創(chuàng)建并啟動了一個線程后,在創(chuàng)建并啟動了一個線程后,runrun方法被系統(tǒng)自動調(diào)方法被系統(tǒng)自動調(diào)用。用。7.2.2 7.2.2 ThreadThread類類在在ThreadThread類中,類中,runrun方法被實現(xiàn)為空方法。方法被實現(xiàn)為空方法。ThreadThread類類的聲明格式如下:的聲明格式如下:public class Thread extends Object implements public class Thread extends Object implemen

6、ts RunnableRunnableThreadThread中的方法如下:中的方法如下: 構(gòu)造方法構(gòu)造方法public Thread( );public Thread(String name)public Thread(Runnale target)public Thread(Runnable target, String name)public Thread(ThreadGroup group, Runnable target)public Thread(ThreadGroup group, String name)public Thread(ThreadGroup group, Runn

7、able target, String name)其中:其中:name是線程名是線程名; target是執(zhí)行線體的目標對象,它必須實現(xiàn)是執(zhí)行線體的目標對象,它必須實現(xiàn) Runnable的的run方法;方法; group是線程所屬的線程組的名字。是線程所屬的線程組的名字。Thread的成員方法的成員方法public final String getName( ) /返回線程名返回線程名public final void setName(String name) /將線程的名字設(shè)置為將線程的名字設(shè)置為namepublic void start( ) /啟動已創(chuàng)建的線程對象啟動已創(chuàng)建的線程對象pub

8、lic final Boolean isAlive( )/線程是否已啟動線程是否已啟動public final ThreadGroup getThreadGroup( ) /返回線程所屬的線程組返回線程所屬的線程組public String toString( ) /以字符串的形式得到線程的以字符串的形式得到線程的 /名字、優(yōu)先級和所屬的線程組等信息名字、優(yōu)先級和所屬的線程組等信息 Thread的靜態(tài)成員方法的靜態(tài)成員方法public static Thread currentThread( ) /返回當前正在執(zhí)行的線程對象返回當前正在執(zhí)行的線程對象public static int acti

9、veCount( ) /返回當前線程組的活動線程個數(shù)返回當前線程組的活動線程個數(shù)public static int enumerate( Thread tarray)/將當前線程組中的活動線程,將當前線程組中的活動線程,/包括子線程復(fù)制到數(shù)組包括子線程復(fù)制到數(shù)組tarray中中 7.2.37.2.3創(chuàng)建線程的方法創(chuàng)建線程的方法繼承繼承ThreadThread方法創(chuàng)建線程方法創(chuàng)建線程 從從ThreadThread類派生出子類,在此子類中覆蓋類派生出子類,在此子類中覆蓋ThreadThread的的runrun方法。方法。實現(xiàn)實現(xiàn)Runnable接口創(chuàng)建線程接口創(chuàng)建線程創(chuàng)建類實現(xiàn)接口創(chuàng)建類實現(xiàn)接口R

10、unnable的的run方法,以此類的對方法,以此類的對象為目標對象,創(chuàng)建了線程對象。象為目標對象,創(chuàng)建了線程對象。7.3 7.3 線程的狀態(tài)與控制線程的狀態(tài)與控制每個線程都存在一個從創(chuàng)建、運行到消亡的生命每個線程都存在一個從創(chuàng)建、運行到消亡的生命周期。周期。在生命周期中,一個線程具有創(chuàng)建、可運行、運在生命周期中,一個線程具有創(chuàng)建、可運行、運行中、阻塞和死亡五種狀態(tài)。行中、阻塞和死亡五種狀態(tài)。ThreadThread類中的方法可以改變線程的狀態(tài)。類中的方法可以改變線程的狀態(tài)。 7.3.1線程的狀態(tài)線程的狀態(tài)1. 創(chuàng)建狀態(tài)創(chuàng)建狀態(tài)(new thread) 2. 可運行狀態(tài)(可運行狀態(tài)(runna

11、ble)3. 運行中狀態(tài)(運行中狀態(tài)(running)4. 阻塞狀態(tài)(阻塞狀態(tài)(Not runnable) 5. 死亡狀態(tài)死亡狀態(tài)(dead)方法方法isAlive用來返回線程的狀態(tài)。如果此方法返回用來返回線程的狀態(tài)。如果此方法返回true,線程處于線程處于、或或Not runnable這幾種狀態(tài)之一。這幾種狀態(tài)之一。如果此方法的返回如果此方法的返回false,線程處于線程處于new thread或或dead狀態(tài)。狀態(tài)。7.3.2對線程狀態(tài)的控制對線程狀態(tài)的控制使線程進入睡眠的使線程進入睡眠的sleep方法方法public static void sleep(long millis) thro

12、ws InterruptedException其中其中millis是指定的睡眠時間。是指定的睡眠時間。暫停線程的暫停線程的yield方法方法public static void yield( )yield方法暫停線程的執(zhí)行。方法暫停線程的執(zhí)行。 join方法方法public final void join( ) throws InterruptedExceptionpublic final void join(long millis) throws InterruptedExceptionjoin方法使本線程暫停執(zhí)行,直到調(diào)用該方法的線程執(zhí)方法使本線程暫停執(zhí)行,直到調(diào)用該方法的線程執(zhí)行結(jié)束后再

13、繼續(xù)執(zhí)行本線程。行結(jié)束后再繼續(xù)執(zhí)行本線程。wait和和notify(notifyall)方法方法 這幾個方法在這幾個方法在java.lang.Object中。中。 wait方法使當前線程進入阻塞狀態(tài),方法使當前線程進入阻塞狀態(tài),notify(notifyall)方方法喚醒等待隊列中的其它線程,使它們進入可運行狀法喚醒等待隊列中的其它線程,使它們進入可運行狀態(tài)態(tài) 和中斷線程有關(guān)的方法和中斷線程有關(guān)的方法 public void interrupt( ) public void boolean isInterrupted( ) public statick void boolean interru

14、pted( ) 方法方法interrupt為線程設(shè)置一個中斷標記,當為線程設(shè)置一個中斷標記,當run方法方法運行時,用運行時,用isInterrupted方法檢測此標記。方法檢測此標記。 靜態(tài)方法靜態(tài)方法interrupted檢測線程是否被中斷,如果是檢測線程是否被中斷,如果是則清除中斷標記并返回則清除中斷標記并返回true。7.4 線程的優(yōu)先級和調(diào)度線程的優(yōu)先級和調(diào)度7.4.1線程的優(yōu)先級線程的優(yōu)先級線程的優(yōu)先級用整數(shù)線程的優(yōu)先級用整數(shù)110表示。最低和最高的優(yōu)先級表示。最低和最高的優(yōu)先級是是1和和10。默認的優(yōu)先級為。默認的優(yōu)先級為5。也可用。也可用Thread類的公用類的公用靜態(tài)常量表示

15、。靜態(tài)常量表示。 public static final int NORM_PRIORITY=5 public static final int MIN_PRIORITY=1 public static final int MAX_PRIORITY=10方法方法getPriority用于獲得線程優(yōu)先級用于獲得線程優(yōu)先級public final int getPriority( )方法方法setPriority用于設(shè)置線程優(yōu)先級:用于設(shè)置線程優(yōu)先級: public final setPriority(int newPriority)7.4.2線程的調(diào)度線程的調(diào)度線程的調(diào)度是負責線程排隊以及線程的

16、調(diào)度是負責線程排隊以及CPU在線程之在線程之間的分配。被選中的線程獲得處理器進入運行狀間的分配。被選中的線程獲得處理器進入運行狀態(tài)。態(tài)。線程的調(diào)度采用占先原則。線程的調(diào)度采用占先原則。對于優(yōu)先級相同的線程,有分時和獨占兩種調(diào)對于優(yōu)先級相同的線程,有分時和獨占兩種調(diào)度方式。度方式。7.5 線程組線程組7.5.1線程組線程組線程組把多個線程集合為一個對象。線程組把多個線程集合為一個對象。java.lang包中的包中的ThreadGroup類實現(xiàn)了線程組的創(chuàng)類實現(xiàn)了線程組的創(chuàng)建和對線程組的操作。對線程組的操作就是對線程建和對線程組的操作。對線程組的操作就是對線程組中的所有線程的操作。組中的所有線程的

17、操作。線程組可以形成樹形結(jié)構(gòu)。在線程組可以形成樹形結(jié)構(gòu)。在java應(yīng)用程序中,最應(yīng)用程序中,最高層的組就是高層的組就是main線程組。線程組。7.5.2 ThreadGroup類類 ThreadGroup的構(gòu)造函數(shù)的構(gòu)造函數(shù)public ThreadGroup(String name)創(chuàng)建一個名字為創(chuàng)建一個名字為name的線程組。的線程組。public ThreadGroup(ThreadGroup parent,String name)在線程組在線程組parent中創(chuàng)建一個線程組中創(chuàng)建一個線程組name。ThreadGroup的方法的方法public final String getName

18、( ) 返回線程組的名返回線程組的名public final ThreadGroup getParent( ) 返回線程組的父線程組返回線程組的父線程組public int activeCount( ) 返回當前線程組中活動線程的個數(shù)返回當前線程組中活動線程的個數(shù)public int enumerate(Thread list )public int enumerate(ThreadGroup list )將當前線程組中的活動線程復(fù)制到線程數(shù)組或線程組數(shù)組中將當前線程組中的活動線程復(fù)制到線程數(shù)組或線程組數(shù)組中public int enumerate(Thread list ,boolean r

19、ecurse)public int enumerate(ThreadGroup list ,boolean recurse)將當前線程組中的活動線程(包括子線程中的)復(fù)制到線程數(shù)組將當前線程組中的活動線程(包括子線程中的)復(fù)制到線程數(shù)組或線程組數(shù)組中或線程組數(shù)組中7.6線程的同步線程的同步7.6.1線程的同步機制線程的同步機制當多個線程對共同的數(shù)據(jù)進行操作時會產(chǎn)生一些問題。當多個線程對共同的數(shù)據(jù)進行操作時會產(chǎn)生一些問題。Java語言提供了線程的同步控制機制。語言提供了線程的同步控制機制。對共享數(shù)據(jù)的線程的對共享數(shù)據(jù)的線程的“互斥互斥”鎖定:鎖定:對于共享的數(shù)據(jù)對象,在任何時刻只能有一個線程對對于共享的數(shù)據(jù)對象,在任何時刻只能有一個線程對它進行操作。這樣可以保證數(shù)據(jù)的完整和一致。它進行操作。這樣可以保證數(shù)據(jù)的完整和一致。傳送數(shù)據(jù)的線程的同步運行:傳送數(shù)據(jù)的線程的同步運行:為了保證傳送的數(shù)據(jù)能及時正確收到,需要傳送數(shù)據(jù)為了保證傳送的數(shù)據(jù)能及時正確收到,需要傳送數(shù)據(jù)的線程必須同步運行的線程必須同步運行 7.6.2共享數(shù)據(jù)的互斥鎖定共享數(shù)據(jù)的互斥鎖定

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論