計算機課件 多線程_第1頁
計算機課件 多線程_第2頁
計算機課件 多線程_第3頁
計算機課件 多線程_第4頁
計算機課件 多線程_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

妻附:多線程

主講:李虹

M主要內(nèi)容

JAVA^

■Case:Clock,java

■Case:AnimatorApplet.java

■多線程

■1、概念

■2、實現(xiàn)多線程的兩種編程方法

■繼承Thread類

■實現(xiàn)Runnable接口

■3、線程的狀態(tài)轉(zhuǎn)換及線程的控制操作

■4、線程間的同步與互斥

■作業(yè):利用多線程實現(xiàn)動畫設計。

多媒體與多線程開始|返回11上一頁11下一頁?2

嬴工、什么是多線程

■在JVM上執(zhí)行的一個Java程序,是操作系統(tǒng)

中的一個遺看。同一個Java程序中的各個并發(fā)

執(zhí)行的代碼片斷,是操作系統(tǒng)中的線程。

■每個線程均設計成具有部分程序功能,并且

能與其他線程并發(fā)執(zhí)行。這種能力稱為多線程

(multithreading)。

多媒體與多線程開始返回?上一頁11下一頁3

JAVA------------------------------------------------------

■多線程的實現(xiàn):

■Java提供了Thread類來實現(xiàn)多線程。在

Java中)線程可以認為是由三部分組成的:

■(1)虛擬CPU,哇寸裝在java.lang.Thread類中,

它控制著整個線程的運行;

■(2)執(zhí)行的代碼,傳遞給Thread類,由

Thread類控制順序執(zhí)行;

■(3)處理的數(shù)據(jù),傳遞給Thread類,是在代

碼執(zhí)行過程中所要處理的數(shù)據(jù)。

多媒體與多線程開始返回I上一頁11下一頁4

盒2、線程創(chuàng)建的兩種方法

■方法之一:繼承Thread類

■1)Thread類的構造方法:

■publicThread(ThreadGroupgroup,

Runnabletarget,Stringname)

■group指明了線程所屬的線程組;target是線

程體run()方法所在的對象;name是線程的名

稱。target必須實現(xiàn)接口Runnable。展接口

Runnable中只定義了一個方法voidrun()作

為線程體。任何實現(xiàn)接口Runnable的對象都

可以作為一個線程的目標對象。

多媒體與多線程開始返回I上一頁11下一頁5

JAVA------------------------------------------------------

■Java對Runnable接口的定義如下:

■publicinterfaceRunnable{

publicabstractvoidrun();

■}

■類Thread本身也實現(xiàn)了接口Runnable,因此,上

述構造方法中各參數(shù)都可以為null,當上述構造方法

的某個參數(shù)為null時,我們可得到下面的幾個構造方

法:

■publicThread()

■publicThread(Stringname)

■publicThread(Runnabletarget)

■publicThread(Runnabletarget,Stringname)

多媒體與多線程開始返回I上一頁I|下一頁6

■2)Thread類有許多方法,在此先給出其中幾

個常用方法,并進行說明。

■StaticnativeThreadcurrentThreadQ:返回線

程對象的一個引用,它控制當前執(zhí)行的線程。在任

何地方利用這個方法都可獲當前是哪一個線程在運

行。

■finalStringgetNameQ:以字符串形式返回線程

的名稱。

■finalintgetPriorityO^返回線程的優(yōu)先級。

■voidstart。:啟動線程對象

■voidsleep(longmillis):使線程暫時休眠millis

毫秒,讓低優(yōu)先級的線程暫時獲取處理器資源。

多媒體與多線程開始返回I上一頁I|下一頁7

JAVA------------------------------------------------------

■voidrun():對線程來說run方法的功能等同于

程序中的main方法的作用。Thread類本身只是線

程的虛擬CPU,線程所執(zhí)行的代碼(或者說線程所

要完成的功能)是通過run方法(包含在一個特定

的對象中)來完成的,方法run。稱為線程體。實

現(xiàn)線程體的特定對象是在初始化線程時傳遞給線程

的。在一個裝程版建立并初始化以后,Java的運行

后系統(tǒng)就自動調(diào)用run方法,正是通過run方京才使

得建立線程的目的得以實現(xiàn)。run方法的結束即意

諫著線程的結束。通常,run方法是一個循環(huán),例

如上一節(jié)中,一個播放動畫的線程要循環(huán)顯示一系

列圖片。

多媒體與多線程開始返回?上一頁11下一頁8

JAVA------------------------------------------------------

■如何編程呢?步驟如下:

■(1)創(chuàng)建一個類擴展Thread類;

■(2)重寫Thread類的run()方法,在此方法中

填寫要在這個線程中要執(zhí)行的代碼;

■(3)用關鍵字new創(chuàng)建所定義的線程類的一個

對象;

■(4)調(diào)用該線程對象的start。方法啟動線程。

多媒體與多線程開始返回上一頁下一頁9

Casel:創(chuàng)建兩個線程,每一個都打印1到

氤詞的數(shù)______________

publicclassMyThreadextendsThread〃從Thread類繼承

<publicMyThread。〃默認構造方法

<super();}

publicMyThread(Stringname)〃構造方法

{super(name);}

publicvoidrun()〃并發(fā)執(zhí)行的程序代碼

<

for(inti=l;i<=5;i++)

<System.out.printlnC'"+1+"n+getNameO);

〃輸出當前數(shù)字及線程名

try{sleep(lOOO);

//休眠工秒,給其它線程運行的機會

}catch(InterruptedExceptione){}

}

}-----------------____________

多媒體與多線程開始返回I上一頁II下一頁I10

JAVA-------------------------------------------------------

publicstaticvoidmain(String[]args)

<〃創(chuàng)建線程工的對象及線程2的對象

MyThreadmyThreadl=newMyThread(“線程工”);

MyThreadmyThreadZ=newMyThread(“線程2");

〃啟動兩個線程

myThreadl.start();

myThread2.start();

}

}

多媒體與多線程開始返回I上一頁I|下一頁U

JAVA------------------------------------------------------

■方法之二:繼承Runnable接口

■編程步驟如下:

■自定義類實現(xiàn)Runnable接口

■定義方法run()

■使用Thread類的另一構造函數(shù):

■Thread(RunnablezString)

用實現(xiàn)了Runnable接口的類的對象中所定義的

run()方法,來覆蓋新創(chuàng)建的線程對象的run()方

■使用start。啟動線程

多媒體與多線程開始返回I上一頁11下一頁12

筍Case2:用Runnable接口實現(xiàn)caseL

J^iibllcclassMyThreadiinplenrentsRunnable〃實現(xiàn)

Runnable接口

<publicMyThreadQ〃默認構造方法

{super();}

publicvoidrun()〃并發(fā)執(zhí)行的程序代碼

{

for(inti=l;i<=5;i++)

<System.out.println(",,+i+"

,,+Thread.CurrentThread().getName());

〃輸出當前數(shù)字及線程名

try{sleep(lOOO);

//休眠工秒,給其它線程運行的機會

}catch(InterruptedExceptione){}

}

}_________________

、多媒體與多線程?開始??..11上一頁|I下一■|]

JAVA-----------------------------------------------------

publicstaticvoidmain(String[]args)

{〃創(chuàng)建線程1的對象及線程2的對象

ThreadmyThreadl=newThread(new

MyThread。,“線程1");

ThreadmyThreadZ=newThread(new

MyThread。,“線程2");

〃啟動兩個線程

myThreadl.start();

myThread2.start();

}

}

多媒體與多線程?開始]I返回11上一頁11下一頁

JAVA-------------------------------------------------------

■兩種方法的選擇

■當需要從其他類(如JApplet類)繼承時,使用

java.lang.Runnable#口

■當編寫簡單的程序時,可考慮使用繼承

java.Iang.ThreadM

■程序分析

■Car.java

■Candle.java

多媒體與多線程開始返回上一頁下一頁15

鎏3、線程的狀態(tài)轉(zhuǎn)換及線程的操作

JAVA----------------------------------------------------------

線程有四個狀態(tài):

創(chuàng)建、可運行、不可運行、死亡。

倉J建)犬態(tài)(newThread)

執(zhí)行下列語句時,線程就處于創(chuàng)建狀態(tài):

ThreadmyThread=newMyThreadClass();

當一個線程處于創(chuàng)建狀態(tài)時,它僅僅是一個空的線程對象,

系統(tǒng)不為它分配資源。

■2.運彳亍以夫態(tài)(Runnable)

ThreadmyThread=newMyThreadClass();

myThread.start();

當一個線程處于可運行狀態(tài)時,系統(tǒng)為這個線程分配了它

需的系統(tǒng)資源,安排其運行并調(diào)用線程運行方法,這樣就使得

該線程處于可運行(Runnable)狀態(tài)。需要注意的是這一狀態(tài)

并不是運行中狀態(tài)(Running),因為線程也許實際上并未真

正運行。由于很多計算機都是單處理器的,所以要在同一時刻

運行所有的處于可運行狀態(tài)的線程是不可能的,Java的運行系

統(tǒng)必須實現(xiàn)調(diào)度來保證這些線程共享處理器。

多媒體與多線程開始返回I上一頁I|下一頁17

JAVA------------------------------------------------------

■3.不可運彳亍》尖態(tài)(NotRunnable)

進入不可運行狀態(tài)的原因有如下幾條:

1)調(diào)用了sfee。()方法'

2)調(diào)用了suspend()方法;

3)為等候一個條件變量,線程調(diào)用wait()方法;

4)輸入輸出流中發(fā)生線程阻塞;

不可運行狀態(tài)也稱為阻塞狀態(tài)(Blocked)。因為某種原因

(輸入/輸出、等待消息或其它阻塞情況),系統(tǒng)不能執(zhí)行線程

的狀態(tài)。這時即使處理器空閑,也不能執(zhí)行該線程。

■4.死亡》失態(tài)(Dead)

線程的終止一般可通過兩種方法實現(xiàn):自然撤消(線程執(zhí)行

X)或是被停止(調(diào)用stopQ方法)。目前不推薦通過調(diào)用

stop。來終止線程的執(zhí)行,而是讓線程執(zhí)行完。

多媒體與多線程開始返回I上一頁I|下一頁18

嬴4、線程間的同步與互斥

-1)線程間的資源互斥共享

■通常,一些同時運行的線程需要共享數(shù)據(jù)。如

果線程只是讀取這個共享的數(shù)據(jù),則不必阻止

多個線程同時訪問該數(shù)據(jù)。但是,在多個線程

共享同一個對象,并且一個或多個線程會修改

該對象時,每個線程就必須要考慮其它與它一

起共享數(shù)據(jù)的線程的狀態(tài)與行為,否則的話就

不能保證共享數(shù)據(jù)的一致性,從而也就不能保

證程序的正確性。這個共享的數(shù)據(jù)區(qū)就是一個

臨界區(qū)。首先觀察下面例題所出現(xiàn)的問題。

多媒體與多線程開始返回I上一頁II下I頁19

JAVA----------------------------------------------------------

■Case3:模擬打電話程序,一個電話接聽者

類通過線程實現(xiàn)若干打電話者。

CAG:\lh\lh\tool\JCREAI'2\GI200L"e-laixi

他說

二開

~大^

、

他說

^您

T關^

T

^

他說

^嗎

?

1T1大

L日

同^X-

4、?

■、?

、I

T?

~

V

多媒體與多線程開始返回上一頁下一頁20

JAVA------------------------------------------------------

■在Java語言中,引入了“對象互斥鎖”的概念(又

稱為監(jiān)視器、管程)來實現(xiàn)不同線程對共享數(shù)據(jù)操作的

同步。這個標記用來保證在任一時刻,只能有一個線程

訪問該對象。即,“對象互斥鎖”阻止多個線程同時訪

問同一共享資源。

■在Java語言中,有兩種方法可以實現(xiàn)“對象互斥

鎖”:

-(工)用關鍵字volatile來聲明一個共享數(shù)據(jù)(變量);

■(2)用關鍵字synchronized來聲明一個操作共享數(shù)據(jù)

的方法或一段代碼。

■一般情況下,都使用synchronized關鍵字在方法的

層次上實現(xiàn)對共享資源操作的同步,很少使用volatile

關鍵字聲明共享變量。

多媒體與多線程開始返回?上一頁11下一頁

■對象鎖機制

格式1:

synchronized(臨界區(qū)對象)

'〃訪問臨界區(qū)對象的“關鍵”代碼片斷,又稱同步代碼

格式2:同步化方法。在方法的前面力口上synchronized。如:

publicsynchronizedvoidadd(){............}

對于實例方法,這種格式其實是如下的第一種格式的簡化寫

法:

publicvoidadd()

synchronized(this)

{............}

}

多媒體與多線程開始返回上一頁下一頁22

JAVA------------------------------------------------------

■Case4:引入互斥鎖機制修改case3(模擬

打電話程序,一個電話接聽者類通過線程實

現(xiàn)若干打電話者。)

貫G:UhUh\tool\KBKAr2\GE2001.exeJnixi

在磐

來的電話,他說:本周二開會?,我在和他交談???

^老

上1

i木的電話,他說:祝您新年快樂?,我在和他交談.

m電話?

i來

兀的電話,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論