版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
項(xiàng)目十多線程
【項(xiàng)目描述】
在Java中,實(shí)現(xiàn)多線程有兩種方法,本項(xiàng)目介紹了兩種不同的方法實(shí)現(xiàn)多線程。在多個(gè)線程對(duì)同一共享資源進(jìn)行寫操作時(shí)可能會(huì)引發(fā)錯(cuò)誤,本項(xiàng)目還演示了使用線程的同步操作來(lái)避免這種錯(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ù)鴨子的過(guò)程?!颈貍渲R(shí)】1.多線程的概念線程是指可以獨(dú)立并發(fā)執(zhí)行的程序單元。而多線程是指程序中同時(shí)存在的多個(gè)執(zhí)行體,它們按照自己的執(zhí)行路線并發(fā)工作,獨(dú)立完成各自的功能,互不干擾。2.線程的生命周期線程的生命周期有5個(gè)狀態(tài):新生狀態(tài):對(duì)象初始化后就進(jìn)入新生狀態(tài),為其分配內(nèi)存空間。就緒狀態(tài):通過(guò)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)建線程的方法有兩種:通過(guò)創(chuàng)建Thread類的子類來(lái)實(shí)現(xiàn);通過(guò)實(shí)現(xiàn)Runnable接口的類來(lái)實(shí)現(xiàn)。
4.繼承Thread類來(lái)實(shí)現(xiàn)多線程[格式10-1通過(guò)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ù)鴨子的過(guò)程。
【任務(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è)對(duì)象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é)果【課堂提問(wèn)】進(jìn)程和線程的區(qū)別是什么?線程的生命周期有哪幾種狀態(tài),這幾種狀態(tài)間是如何轉(zhuǎn)換的?啟動(dòng)多線程的應(yīng)該調(diào)用什么方法?【現(xiàn)場(chǎng)演練】模仿任務(wù)10-1,利用Thread類實(shí)現(xiàn)多線程,模擬3個(gè)人同時(shí)派發(fā)招生簡(jiǎn)章的情形,假設(shè)每人要派發(fā)100份。任務(wù)二
用Runnable接口實(shí)現(xiàn)多線程【任務(wù)描述】任務(wù)10-2:利用Runnable接口實(shí)現(xiàn)多線程。模擬兩個(gè)線程同時(shí)數(shù)鴨子的過(guò)程?!颈貍渲R(shí)】1.利用接口Runnable來(lái)實(shí)現(xiàn)多線程
接口Runnable中的方法:通過(guò)Runnable接口實(shí)現(xiàn)多線程的語(yǔ)法格式如下:[格式10-2通過(guò)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è)該類的對(duì)象。4.以此對(duì)象為參數(shù)建立Thread類對(duì)象。5.Thread對(duì)象調(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類通過(guò)實(shí)現(xiàn)Runnable接口,使得該類有了多線程類的特征。run()方法是多線程的一個(gè)約定,所有的多線程代碼都在run方法里面。不管是繼承Thread類還是實(shí)現(xiàn)Runnable接口來(lái)實(shí)現(xiàn)多線程,啟動(dòng)多線程仍然是使用Thread類的start()方法,因此使用了Thread類的構(gòu)造方法publicThread(Runnabletarget),接收了Runnable的子類實(shí)例對(duì)象。
【課堂提問(wèn)】在Java中有幾種實(shí)現(xiàn)多線程的方法?繼承Thread類和實(shí)現(xiàn)Runnable接口的區(qū)別是什么?線程的主體方法是什么?
【現(xiàn)場(chǎng)演練】
模仿任務(wù)10-2,利用Runnable接口實(shí)現(xiàn)多線程,模擬3個(gè)人同時(shí)派發(fā)招生簡(jiǎn)章的情形,假設(shè)每人要派發(fā)100份。任務(wù)三
線程的同步與死鎖【任務(wù)描述】任務(wù)10-3-1:某商家十周年店慶,免費(fèi)贈(zèng)送100份禮品,前100名申請(qǐng)的用戶可獲得贈(zèng)品。假設(shè)沒(méi)有限制每個(gè)賬號(hào)索取的份數(shù),并假定當(dāng)前有4個(gè)用戶正在同時(shí)申請(qǐng)贈(zèng)品。本任務(wù)通過(guò)使用線程同步代碼塊來(lái)避免贈(zèng)品出現(xiàn)負(fù)數(shù)的這種錯(cuò)誤。任務(wù)10-3-2:多個(gè)線程對(duì)同一共享資源進(jìn)行寫操作時(shí)可能引發(fā)錯(cuò)誤。本任務(wù)通過(guò)使用線程同步方法塊來(lái)避免贈(zèng)品出現(xiàn)負(fù)數(shù)的這種錯(cuò)誤?!颈貍渲R(shí)】1.多線程資源共享安全問(wèn)題
多個(gè)線程同時(shí)操作一個(gè)對(duì)象,則此對(duì)象稱為共享對(duì)象。如果要對(duì)共享對(duì)象進(jìn)行寫操作,那么在一個(gè)線程進(jìn)行寫操作的過(guò)程中,為保證結(jié)果的正確性,其他線程不能同時(shí)對(duì)共享資源進(jìn)行操作的。2.線程的同步操作
線程的同步是保證多線程安全訪問(wèn)共享資源的一種手段,可使用同步代碼塊和同步方法來(lái)實(shí)現(xiàn)線程的同步操作。(1)同步代碼塊:[格式10-3同步代碼塊]{synchronized(同步對(duì)象)
需要同步的代碼;}(2)同步方法:[格式10-4同步方法]
synchronized方法返回值
方法名(參數(shù)列表){
}
【解題思路】
任務(wù)10-3-1:1.創(chuàng)建申請(qǐng)贈(zèng)品類GetGiftThread,申請(qǐng)贈(zèng)品這個(gè)操作充許多個(gè)用戶同時(shí)進(jìn)行,該類要實(shí)現(xiàn)了多線程。2.當(dāng)某個(gè)線程比較到100份贈(zèng)品還沒(méi)送完時(shí)(即gift>0),則可成功申請(qǐng)到贈(zèng)品,并且贈(zèng)品數(shù)要減1。3.把判斷贈(zèng)品是否為零和申請(qǐng)贈(zèng)品、贈(zèng)品數(shù)減1操作放到同步代碼塊中。4.創(chuàng)建主類,創(chuàng)建主方法,在主方法中定義進(jìn)程對(duì)象,創(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("恭喜您成功申請(qǐng)到贈(zèng)品!");
System.out.println("贈(zèng)品還剩:"+(--gift)+"份");
}
} } }}
public
classThreadDemo10_3_1Test{
public
static
voidmain(String[]args){ GetGiftThreadgt=newGetGiftThread();//定義線程對(duì)象 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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年版的云計(jì)算服務(wù)合同
- 不可撤銷信用證范文(2024版)
- 2025年度草種市場(chǎng)調(diào)研與銷售合同3篇
- 《任教學(xué)科語(yǔ)》課件
- 2024高新技術(shù)產(chǎn)品進(jìn)出口貿(mào)易合同
- 2024招投標(biāo)與合同管理實(shí)務(wù):國(guó)有企業(yè)合規(guī)管理細(xì)則3篇
- 2025年度草場(chǎng)租賃與草原畜牧業(yè)發(fā)展協(xié)議3篇
- 2024年網(wǎng)絡(luò)直播平臺(tái)技術(shù)服務(wù)與授權(quán)合同
- 2024房地產(chǎn)公司合同類別
- 2025年度航空航天發(fā)動(dòng)機(jī)采購(gòu)合同范本與性能測(cè)試要求3篇
- ISO 56001-2024《創(chuàng)新管理體系-要求》專業(yè)解讀與應(yīng)用實(shí)踐指導(dǎo)材料之3:4組織環(huán)境-4.1理解組織及其環(huán)境(雷澤佳編制-2025B0)
- 2024-2030年中國(guó)管道檢測(cè)工程行業(yè)前景分析發(fā)展規(guī)劃研究報(bào)告
- 抗心律失常藥物臨床應(yīng)用中國(guó)專家共識(shí)
- 考級(jí)代理合同范文大全
- 2024解析:第三章物態(tài)變化-講核心(原卷版)
- 新的護(hù)理交班模式
- 安全行車知識(shí)培訓(xùn)
- 2024年安徽省高校分類對(duì)口招生考試數(shù)學(xué)試卷真題
- 第12講 語(yǔ)態(tài)一般現(xiàn)在時(shí)、一般過(guò)去時(shí)、一般將來(lái)時(shí)(原卷版)
- 2024年采購(gòu)員年終總結(jié)
- 2024年新疆區(qū)公務(wù)員錄用考試《行測(cè)》試題及答案解析
評(píng)論
0/150
提交評(píng)論