Java程序設(shè)計(jì)教程(第三版)課件 項(xiàng)目十 多線程_第1頁
Java程序設(shè)計(jì)教程(第三版)課件 項(xiàng)目十 多線程_第2頁
Java程序設(shè)計(jì)教程(第三版)課件 項(xiàng)目十 多線程_第3頁
Java程序設(shè)計(jì)教程(第三版)課件 項(xiàng)目十 多線程_第4頁
Java程序設(shè)計(jì)教程(第三版)課件 項(xiàng)目十 多線程_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

項(xiàng)目十多線程

【項(xiàng)目描述】

在Java中,實(shí)現(xiàn)多線程有兩種方法,本項(xiàng)目介紹了兩種不同的方法實(shí)現(xiàn)多線程。在多個(gè)線程對同一共享資源進(jìn)行寫操作時(shí)可能會(huì)引發(fā)錯(cuò)誤,本項(xiàng)目還演示了使用線程的同步操作來避免這種錯(cuò)誤。【任務(wù)分解】本項(xiàng)目可分解為以下三個(gè)任務(wù):用Thread類實(shí)現(xiàn)多線程。用Runnable接口實(shí)現(xiàn)多線程。線程的同步與死鎖。任務(wù)一用Thread類實(shí)現(xiàn)多線程【任務(wù)描述】任務(wù)10-1:利用Thread類實(shí)現(xiàn)多線程。模擬兩個(gè)線程同時(shí)數(shù)鴨子的過程。【必備知識】1.多線程的概念線程是指可以獨(dú)立并發(fā)執(zhí)行的程序單元。而多線程是指程序中同時(shí)存在的多個(gè)執(zhí)行體,它們按照自己的執(zhí)行路線并發(fā)工作,獨(dú)立完成各自的功能,互不干擾。2.線程的生命周期線程的生命周期有5個(gè)狀態(tài):新生狀態(tài):對象初始化后就進(jìn)入新生狀態(tài),為其分配內(nèi)存空間。就緒狀態(tài):通過start()方法進(jìn)入就緒狀態(tài),進(jìn)入線程隊(duì)列,等待CPU。運(yùn)行狀態(tài):運(yùn)行自己的run()方法,直到調(diào)用其他方法、完成任務(wù)、資源阻塞等終止。阻塞狀態(tài):就是在運(yùn)行狀態(tài)由于資源得不到滿足讓出CPU,進(jìn)入阻塞狀態(tài)。消亡狀態(tài):兩種情況進(jìn)入消亡狀態(tài)。1)正常運(yùn)行的線程完成了它的工作內(nèi)容。2)被強(qiáng)制終止,如:調(diào)用stop()或destroy()方法。

阻塞解除阻塞事件

start()stop()或destory()調(diào)度選中

新生狀態(tài)就緒狀態(tài)運(yùn)行狀態(tài)阻塞狀態(tài)消亡狀態(tài)線程的生命周期3.實(shí)現(xiàn)多線程的兩種方法

在Java中,創(chuàng)建線程的方法有兩種:通過創(chuàng)建Thread類的子類來實(shí)現(xiàn);通過實(shí)現(xiàn)Runnable接口的類來實(shí)現(xiàn)。

4.繼承Thread類來實(shí)現(xiàn)多線程[格式10-1通過Thread類實(shí)現(xiàn)多線程]class類名extendsThread{

屬性;//定義類的屬性…

方法;//定義類的方法…publicvoidrun(){//重寫Thread類的run()方法

線程主體;}}【解題思路】

任務(wù)10-1:1.首先創(chuàng)建一個(gè)Thread類的一個(gè)子類。2.在子類中實(shí)現(xiàn)run()方法。3.在main()方法中調(diào)用start()方法。重溫任務(wù):任務(wù)10-1:利用Thread類實(shí)現(xiàn)多線程。模擬兩個(gè)線程同時(shí)數(shù)鴨子的過程。

【任務(wù)透析】packagecom;classShuYaZiThreadextendsThread{ privateStringname; publicShuYaZiThread(Stringname){ =name; } publicvoidrun(){ for(inti=0;i<=10;i++){ System.out.println(name+":第"+i+"只鴨子"); try{ Thread.sleep(500);

}catch(InterruptedExceptione){ e.printStackTrace();

}

} } }

publicclassThreadDemo10_1Test{ publicstaticvoidmain(String[]args){

ShuYaZiThreadmt1=newShuYaZiThread("王文軒");

ShuYaZiThreadmt2=newShuYaZiThread("孫桐桐");

mt1.start();

mt2.start();

}}本任務(wù)案例中,兩個(gè)對象mt1和mt2分別調(diào)用了start()方法啟動(dòng)了兩個(gè)線程。start()方法的調(diào)用并不是立即執(zhí)行多線程代碼,而是使得線程變?yōu)榫蜖钚袘B(tài),什么時(shí)候運(yùn)行是由操作系統(tǒng)調(diào)度的。

圖10.2任務(wù)10-1的運(yùn)行結(jié)果【課堂提問】進(jìn)程和線程的區(qū)別是什么?線程的生命周期有哪幾種狀態(tài),這幾種狀態(tài)間是如何轉(zhuǎn)換的?啟動(dòng)多線程的應(yīng)該調(diào)用什么方法?【現(xiàn)場演練】模仿任務(wù)10-1,利用Thread類實(shí)現(xiàn)多線程,模擬3個(gè)人同時(shí)派發(fā)招生簡章的情形,假設(shè)每人要派發(fā)100份。任務(wù)二

用Runnable接口實(shí)現(xiàn)多線程【任務(wù)描述】任務(wù)10-2:利用Runnable接口實(shí)現(xiàn)多線程。模擬兩個(gè)線程同時(shí)數(shù)鴨子的過程?!颈貍渲R】1.利用接口Runnable來實(shí)現(xiàn)多線程

接口Runnable中的方法:通過Runnable接口實(shí)現(xiàn)多線程的語法格式如下:[格式10-2通過Runnable接口實(shí)現(xiàn)多線程]class類名implementsRunnable{

屬性;//定義類的屬性…

方法;//定義類的方法…publicvoidrun(){//重寫Runnable接口中的run()方法

線程主體;}}線程的幾個(gè)重要方法:sleep(longmillis):讓一個(gè)線程進(jìn)入休眠狀態(tài),即使程序的執(zhí)行暫停一段指定的時(shí)間。單位為毫秒。setName(Stringname):設(shè)置線程名字。getName():返回線程的名字。currentThread():返回當(dāng)前的線程,返回類型為Thread。isAlive():判斷線程是否處在動(dòng)行狀態(tài),如果是返回true,否則返回false。yield():將目前正在執(zhí)行的線程暫停。【解題思路】

任務(wù)10-2:1.設(shè)計(jì)一個(gè)實(shí)現(xiàn)接口Runnable的類。2.重寫線程的run()方法。3.創(chuàng)建一個(gè)該類的對象。4.以此對象為參數(shù)建立Thread類對象。5.Thread對象調(diào)用start()方法。

【任務(wù)透析】//任務(wù)10-2源程序:ThreadDemo10_2Test.javapackagecom;classShuYaZiThreadimplementsRunnable{privateStringname;publicShuYaZiThread(Stringname){=name; }

publicvoidrun(){for(inti=0;i<=10;i++){System.out.println(name+":第"+i+"只鴨子");try{ Thread.sleep(500);}catch(InterruptedExceptione){e.printStackTrace();}} }}publicclassThreadDemo10_2Test{publicstaticvoidmain(String[]args){ShuYaZiThreadmt1=newShuYaZiThread("王文軒");ShuYaZiThreadmt2=newShuYaZiThread("孫桐桐");Threadt1=newThread(mt1);Threadt2=newThread(mt2);t1.start();t2.start();

}}圖10.3任務(wù)10-2的運(yùn)行結(jié)果

本任務(wù)案例中,ShuYaZiThread類通過實(shí)現(xiàn)Runnable接口,使得該類有了多線程類的特征。run()方法是多線程的一個(gè)約定,所有的多線程代碼都在run方法里面。不管是繼承Thread類還是實(shí)現(xiàn)Runnable接口來實(shí)現(xiàn)多線程,啟動(dòng)多線程仍然是使用Thread類的start()方法,因此使用了Thread類的構(gòu)造方法publicThread(Runnabletarget),接收了Runnable的子類實(shí)例對象。

【課堂提問】在Java中有幾種實(shí)現(xiàn)多線程的方法?繼承Thread類和實(shí)現(xiàn)Runnable接口的區(qū)別是什么?線程的主體方法是什么?

【現(xiàn)場演練】

模仿任務(wù)10-2,利用Runnable接口實(shí)現(xiàn)多線程,模擬3個(gè)人同時(shí)派發(fā)招生簡章的情形,假設(shè)每人要派發(fā)100份。任務(wù)三

線程的同步與死鎖【任務(wù)描述】任務(wù)10-3-1:某商家十周年店慶,免費(fèi)贈(zèng)送100份禮品,前100名申請的用戶可獲得贈(zèng)品。假設(shè)沒有限制每個(gè)賬號索取的份數(shù),并假定當(dāng)前有4個(gè)用戶正在同時(shí)申請贈(zèng)品。本任務(wù)通過使用線程同步代碼塊來避免贈(zèng)品出現(xiàn)負(fù)數(shù)的這種錯(cuò)誤。任務(wù)10-3-2:多個(gè)線程對同一共享資源進(jìn)行寫操作時(shí)可能引發(fā)錯(cuò)誤。本任務(wù)通過使用線程同步方法塊來避免贈(zèng)品出現(xiàn)負(fù)數(shù)的這種錯(cuò)誤?!颈貍渲R】1.多線程資源共享安全問題

多個(gè)線程同時(shí)操作一個(gè)對象,則此對象稱為共享對象。如果要對共享對象進(jìn)行寫操作,那么在一個(gè)線程進(jìn)行寫操作的過程中,為保證結(jié)果的正確性,其他線程不能同時(shí)對共享資源進(jìn)行操作的。2.線程的同步操作

線程的同步是保證多線程安全訪問共享資源的一種手段,可使用同步代碼塊和同步方法來實(shí)現(xiàn)線程的同步操作。(1)同步代碼塊:[格式10-3同步代碼塊]{synchronized(同步對象)

需要同步的代碼;}(2)同步方法:[格式10-4同步方法]

synchronized方法返回值

方法名(參數(shù)列表){

}

【解題思路】

任務(wù)10-3-1:1.創(chuàng)建申請贈(zèng)品類GetGiftThread,申請贈(zèng)品這個(gè)操作充許多個(gè)用戶同時(shí)進(jìn)行,該類要實(shí)現(xiàn)了多線程。2.當(dāng)某個(gè)線程比較到100份贈(zèng)品還沒送完時(shí)(即gift>0),則可成功申請到贈(zèng)品,并且贈(zèng)品數(shù)要減1。3.把判斷贈(zèng)品是否為零和申請贈(zèng)品、贈(zèng)品數(shù)減1操作放到同步代碼塊中。4.創(chuàng)建主類,創(chuàng)建主方法,在主方法中定義進(jìn)程對象,創(chuàng)建4個(gè)線程并啟動(dòng)?!救蝿?wù)透析】//任務(wù)10-3-1源代碼:ThreadDemo10_3_1Test.javaclassGetGiftThreadimplementsRunnable{

private

intgift=100;

public

voidrun(){

for(inti=0;i<100;i++){synchronized(this){

if(gift>0){

try{

Thread.sleep(100);

}catch(InterruptedExceptione){

e.printStackTrace();

}

System.out.println("恭喜您成功申請到贈(zèng)品!");

System.out.println("贈(zèng)品還剩:"+(--gift)+"份");

}

} } }}

public

classThreadDemo10_3_1Test{

public

static

voidmain(String[]args){ GetGiftThreadgt=newGetGiftThread();//定義線程對象 Threadt1=newThread(gt); Threadt2=newThread(gt); Threadt3=newThread(gt); Threadt4=newThread(gt); t1.start();//啟動(dòng)線程 t2.start(); t3.start(); t4.start(); }}圖10.5任務(wù)10-3-1ThreadDemo10_3_1Test的運(yùn)行結(jié)果【解題思路】

任務(wù)10-3-2:

步驟3改為同步方法實(shí)現(xiàn),其余步驟和任務(wù)10-3-1相同。

//任務(wù)10-3-2源代碼:ThreadDemo10_3_2Test.javaclassGetGiftThreadimplementsRunnable{

private

intgift=100;

public

voidrun(){

for(inti=0;i<100;i++){this.apply();}}

publicsynchronizedvoidapply(){ if(gift>0){

try{ Thread.sleep(100); }catch(InterruptedExceptione){ e.printStackTrace(); } System.out.println("恭喜您成功申

溫馨提示

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

評論

0/150

提交評論