第9章 多線程機制與動畫_第1頁
第9章 多線程機制與動畫_第2頁
第9章 多線程機制與動畫_第3頁
第9章 多線程機制與動畫_第4頁
第9章 多線程機制與動畫_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第九章

多線程機制與動畫本章學習目標支持多線程是Java程序的優(yōu)點之一,本章介紹多線程編程的技術(shù)。本章的目標是:深入理解進程與線程的概念,線程優(yōu)先級的概念;理解線程的新建、可運行、運行、阻塞和終止5種狀態(tài)。掌握通過繼承Thread類和使用Rannable接口建立線程和多線程的方法。基本掌握多線程程序的設(shè)計方法。掌握使用定時器實現(xiàn)動畫效果的技術(shù)和控制動畫的技術(shù)。第九章

多線程機制與動畫9.1

線程的建立9.1.1

進程與線程的概念在一臺計算機中,可能有多個程序同時運行,一個正在運行的程序稱為一個進程。進程不僅有自己的程序代碼,而且擁有自己的數(shù)據(jù)空間占用某些系統(tǒng)資源。盡管進程與進程之間可以通過某些方式進行通信和共享,例如使用剪切板、文件等,但是進程與進程之間是彼此平等、獨立的,即分別擁有數(shù)據(jù)空間、占用系統(tǒng)資源。如果把進程劃分成幾個更小的運行單位,讓每個運行單位作為一個順序控制流,這就是線程。即線程是比進程更小的運行單位,是進程內(nèi)部的一段程序。當一個進程使用多線程的方式時,就能在一個進程中同時啟用多個線程,這就提高了程序的效率,或者借此達到某種目的。第九章

多線程機制與動畫9.1

線程的建立線程與進程不同的是,一個進程中的多個線程共享同一個數(shù)據(jù)空間和占用的系統(tǒng)資源,創(chuàng)建線程和進行線程之間的切換時,所花費的代價很小,是輕負荷的。每一個程序自動擁有一個線程稱為主線程,若要使用其它線程,必須通過編程來實現(xiàn)。Java語言支持多線程機制,在Java程序中可以很方便地創(chuàng)建多線程。創(chuàng)建多線程主要有兩個途徑,用Rannable接口建立線程和繼承Thread類建立線程,以下幾節(jié)分別介紹并舉例說明。9.1.2

繼承Thread類建立線程建立線程的一個辦法是繼承線程類Thread,表9-1給出了Thread類的構(gòu)造方法,表9-2給出了Thread類的常用實例方法。第九章

多線程機制與動畫9.1

線程的建立表9-1

Thread類的構(gòu)造方法構(gòu)造方法解釋public

Thread()創(chuàng)建一個線程對象public

Thread(Runnabletarget)創(chuàng)建一個線程對象,參數(shù)target指明實際執(zhí)行線程體的目標對象,如果為null表示由對象本身執(zhí)行線程體public

Thread(String

name)創(chuàng)建一個線程對象,參數(shù)name為線程名,若該參數(shù)為null,則Java自動為線程提供一個唯一的名字public

Thread(Runnabletarget,

String

name)創(chuàng)建一個線程對象,參數(shù)target指明實際執(zhí)行線程體的目標對象,參數(shù)

name指定線程名第九章

多線程機制與動畫9.1線程的建立表9-2

Thread類的常用方法常用方法解釋靜態(tài)方法public

static

Thread

currentThread()獲取當前線程public

static

void

sleep(long

millis)使線程睡眠millis毫秒public

static

void

sleep(long

millis,int

nanos)使線程睡眠millis毫秒加十億分之nanos秒public

static

void

yield()使線程暫停public

static

boolean

interrupted()獲取當前線程是否中斷成員方法public

void

start()啟動線程public

void

run()線程體,是用戶必須重寫的空方法public

void

interrupt()中斷線程public

void

destroy()銷毀線程第九章

多線程機制與動畫9.1

線程的建立用繼承Thread的辦法建立線程的主要步驟是:第一,聲明一個類,該類要繼承Thread類并編寫run方法的代碼,通常的寫法是:class

thread

1

extends

Thread{public

void

run(){//書寫線程體方法}}第二,用new關(guān)鍵字創(chuàng)建該類的一個實例對象,可以寫成:thread1

threadName;Pythagora=new

thread

Name

();第三,用start方法啟動這個線程:thread

Name.start();實例

畢達哥拉斯數(shù)和完全平方數(shù)第九章

多線程機制與動畫9.1線程的建立9.1.3

用Rannable接口建立線程建立線程的另一種辦法是使用Rannable接口,Rannable接口只有一個run方法,用戶必須實現(xiàn)run方法,已經(jīng)實現(xiàn)的run方法稱為線程體。表9-3給出了run方法的原形。表9-3用Rannable接口的run方法方法解釋public

void

run

(

)Rannable接口的線程方法用Rannable接口建立線程首先要聲明一個類,該類要實現(xiàn)Rannable接口,并編寫run方法的代碼,通常的寫法是:第九章

多線程機制與動畫4.2

類的繼承class

thread

Class

Name

implements

Runnable{public

void

run(){//書寫線程體方法}}第二,用new關(guān)鍵字創(chuàng)建該類的一個實例對象,可以寫成:thread

ClassName

target

=

new

thread

ClassName();第三,用new關(guān)鍵字以這個對象作為目標對象來創(chuàng)建一個線程,具體是:Thread

my

Thread

=

new

Thread(target);第四,用Thread類的start方法啟動這個線程:my

Thread.start();以上內(nèi)容涉及到Thread類的一些知識,將在9.2節(jié)中介紹,下面是用Rannable接口建立線程的例子。在這個例子中使用了FontMetrics類的stringWidth方法獲取字符串的長度,這個長度不是String類的length方法獲取的字符數(shù),而是以顯示像素為單位的字符串的長度。表9-4給出了該方法的用法。第九章

多線程機制與動畫表9-39.1

線程的建立用Rannable接口的run方法方法解釋構(gòu)造方法protectedFontMetrics(Font

font)創(chuàng)建一個FontMetrics對象,用于獲取font指定字體的高度、寬度信息成員方法public

intstringWidth(String

str)獲取str指定字符串的寬度實例

滾動字符串本例運行時在Applet窗口中顯示兩個字符串,以相反的方向左右反復(fù)滾動,這個效果是用Rannable接口建立的線程實現(xiàn)的。以下是源程序。第九章

多線程機制與動畫9.1

線程的建立9.1.4

用Rannable接口建立多線程作為上例的擴充,本例介紹使用Rannable接口建立兩個線程的方法,這個方法很容易推廣到更多的線程。先看源程序:實例

時鐘和字符串第九章

多線程機制與動畫9.2

關(guān)于線程的進一步討論9.2.1

線程的狀態(tài)當使用new語句創(chuàng)建一個線程時線程處于新建狀態(tài),這時線程不會立即自動運行,而且相應(yīng)的系統(tǒng)資源也還沒有配置。啟動線程使用start方法,這時線程進入可運行狀態(tài)。處于可運行狀態(tài)的線程并不一定正在運行,這根據(jù)操作系統(tǒng)是否給該線程分配時間而定,只有該線程獲得CPU的使用權(quán),才運行該線程。若一個線程因某種原因不能繼續(xù)運行,那么該線程就處于阻塞狀態(tài),當引起阻塞的原因消除時,線程重新進入可運行狀態(tài),并從原來中止的地方繼續(xù)運行。sleep等方法是常用的主動造成阻塞的方法,在前面章節(jié)的例子中曾經(jīng)使用過這種方法。當run方法正常結(jié)束,或者異常終止run方法時,線程轉(zhuǎn)為終止狀態(tài)或稱死亡狀態(tài)。一個線程除了按照新建→可運行→終止的生命周期運行以外,多種因素會引起線程的阻塞和重新運行,其中有來自本線程主動造成的阻塞,也有來自其它線程、其它程序或硬件的被動造成的阻塞。第九章

多線程機制與動畫9.2

關(guān)于線程的進一步討論9.2.2

線程的優(yōu)先級如果有多個線程同時運行,則這些線程排隊等待CPU資源,此時每一個線程自動獲得一個線程的優(yōu)先級,優(yōu)先級的高低代表了線程的緊迫和重要程度,所有可運行狀態(tài)的線程依照優(yōu)先級進行進行排隊。共有10個線程優(yōu)先級,用數(shù)字1到10表示,優(yōu)先級1為優(yōu)先級最高,創(chuàng)建一個新的線程時,默認的優(yōu)先級是5。在Thread類中與線程優(yōu)先級有關(guān)的方法有兩個,如表9-5所示。方法解釋public

final

int

getPriority()獲取線程的優(yōu)先級public

final

void

setPriority(intnewPriority)設(shè)置線程的優(yōu)先級表9-5與線程優(yōu)先級有關(guān)的方法第九章

多線程機制與動畫9.2

關(guān)于線程的進一步討論9.2.3線程組在Java中,可以把多個線程集成為一個線程組,線程組中的每一個線程都是線程組的成員,對線程組的操作就是同時對組內(nèi)所有線程的操作,這種機制簡化了多線程程序的編程。ThreadGroup是線程組類。創(chuàng)建線程組的一般步驟是:第一,用線程組類ThreadGroup的構(gòu)造方法創(chuàng)建一個線程組。第二,用Thread類的構(gòu)造方法創(chuàng)建若干個屬于該線程組的線程。第三,用Thread類的方法對各個線程進行操作,用ThreadGroup類的方法對整個線程組進行操作。表9-6給出了ThreadGroup類的最常用的構(gòu)造方法,表9-7作為表9-6的補充給出了與線程組有關(guān)的Thread類的構(gòu)造方法。至于ThreadGroup類的常用成員方法,與表9-2所列的Thread類類似,請對照使用。第九章

多線程機制與動畫9.2

關(guān)于線程的進一步討論表9-5

與線程優(yōu)先級有關(guān)的方法表9-5

與線程優(yōu)先級有關(guān)的方法構(gòu)造方法解釋public

ThreadGroup(String

name)創(chuàng)建一個線程組對象,參數(shù)name為線程組名構(gòu)造方法解釋public

Thread(ThreadGroup

group,Runnable

target)創(chuàng)建一個屬于線程組group的線程對象,參數(shù)

target指明實際執(zhí)行線程體的目標對象,如果為null表示由對象本身執(zhí)行線程體public

Thread(ThreadGroup

group,String

name)創(chuàng)建一個屬于線程組group的線程對象,參數(shù)

name為線程名,若該參數(shù)為null,則Java自動為線程提供一個唯一的名字public

Thread(ThreadGroup

group,Runnable

target,

String

name)創(chuàng)建一個屬于線程組group的線程對象參數(shù)

target指明實際執(zhí)行線程體的目標對象,參數(shù)name指定線程名實例

多線程第九章

多線程機制與動畫9.3

圖像動畫在節(jié)中曾經(jīng)有一個“連續(xù)位圖動畫”的例子,該例中有如下幾個語句用來起延時的作用:for

(int

j=0

;

j<50000000

;

j++){}這種延時方法是極其不精確的,在不同機器的不同軟硬件環(huán)境下,延時效果有很大的差異。要想精確的延時,方法一是在線程中使用Thread類的sleep方法進行精確到納秒(ns)的延時,為此需要把“連續(xù)位圖動畫”例子中的程序加以修改,見節(jié)。實現(xiàn)精確延時的方法二是構(gòu)造一個定時器,然后用定時器控制動畫程序的運行,將在節(jié)到節(jié)介紹。第九章

多線程機制與動畫9.3

圖像動畫用線程控制動畫本例由“連續(xù)位圖動畫”修改而成,其效果比“連續(xù)位圖動畫”更好,以下是修改后的源程序。實例

改進連續(xù)位圖動畫定時器在編程中經(jīng)常需要每隔某一固定的時間間隔就自動地執(zhí)行某一段程序,例如操作系統(tǒng)的時鐘中斷就是這樣的工作的。要實現(xiàn)這一功能可以專門建立一個線程,在該線程中每隔指定的時間間隔去調(diào)用指定

溫馨提示

  • 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

提交評論