版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年玉林貨運(yùn)從業(yè)資格仿真考題
- 2024商標(biāo)轉(zhuǎn)讓及品牌升級合同:攜手共進(jìn)品牌升級之旅3篇
- 2024商混合同范本:商混混凝土生產(chǎn)與質(zhì)量控制合作協(xié)議3篇
- 2025廚房設(shè)備銷售合同版
- 商業(yè)綜合體電力施工合同范本
- 城市公園旁咖啡館租賃合同
- 城市綠化帶擴(kuò)建植樹合同
- 出入境文件公證辦理規(guī)范
- 智能家居維修員招聘合同模板
- 汽車研發(fā)中心施工協(xié)議
- 【道法廣角】成語故事會(huì):立木為信
- 《我們?nèi)タ春!烽喿x答案
- 智慧酒店無人酒店綜合服務(wù)解決方案
- 考研英語一新題型歷年真題(2005-2012)
- 健身房會(huì)籍顧問基礎(chǔ)培訓(xùn)資料
- 9脊柱與四肢、神經(jīng)系統(tǒng)檢查總結(jié)
- 秀場內(nèi)外-走進(jìn)服裝表演藝術(shù)智慧樹知到答案章節(jié)測試2023年武漢紡織大學(xué)
- 【高分復(fù)習(xí)筆記】王建《現(xiàn)代自然地理學(xué)》(第2版)筆記和課后習(xí)題詳解
- TSGD0012023年壓力管道安全技術(shù)監(jiān)察規(guī)程-工業(yè)管道(高清晰版)
- SMM英國建筑工程標(biāo)準(zhǔn)計(jì)量規(guī)則中文 全套
- 2023-2024學(xué)年浙江省富陽市小學(xué)數(shù)學(xué)四年級上冊期末通關(guān)題
評論
0/150
提交評論