版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
主講教師張智計(jì)算機(jī)學(xué)院網(wǎng)絡(luò)工程系8
線程8.1線程概念8.2創(chuàng)建線程8.3線程同步8.4線程間協(xié)作8.1線程概念認(rèn)識(shí)線程(從OS系統(tǒng)角度)現(xiàn)在的OS都是多任務(wù)操作系統(tǒng),比如你在聽歌的同時(shí)還在用QQ聊天。聽歌和聊天就是兩個(gè)任務(wù),這兩個(gè)任務(wù)是“同時(shí)”進(jìn)行的。一個(gè)任務(wù)一般對(duì)應(yīng)一個(gè)進(jìn)程,也可能包含好幾個(gè)進(jìn)程。微觀:在一個(gè)進(jìn)程中,可能有多個(gè)不同功能的程序塊,例如某個(gè)程序塊正在等待打印機(jī),此時(shí)CPU是空閑的,其他程序塊可利用這個(gè)時(shí)機(jī)搶占CPU執(zhí)行計(jì)算。進(jìn)程中這樣的程序塊就稱為線程。多線程的目的是為了最大限度的利用CPU資源。8.1線程概念(續(xù))一般的Java程序都是單線程的比如,用Java命令運(yùn)行一個(gè)最簡(jiǎn)單的HelloWorld的Java程序時(shí),就啟動(dòng)了一個(gè)JVM進(jìn)程,JVM找到程序的入口點(diǎn)main(),然后運(yùn)行main()方法,這樣就產(chǎn)生了一個(gè)main線程(主線程)。當(dāng)main方法結(jié)束后,主線程運(yùn)行完成。JVM進(jìn)程也隨即退出。8.1線程概念(續(xù))進(jìn)程是正在執(zhí)行的程序。線程是進(jìn)程中一個(gè)單一的順序控制流程。一個(gè)或更多的線程構(gòu)成了一個(gè)進(jìn)程。線程是進(jìn)程中的一個(gè)實(shí)體,是能被OS獨(dú)立調(diào)度和分派的基本單位?!綬eturn】8.2創(chuàng)建線程classHelloThreadimplementsRunnable{inti;
publicvoidrun(){
//重寫run()方法i=0;while(true){System.out.println("Hello"+i++);if(i>5)break;
}
}}publicclasstestThread{publicstaticvoidmain(String[]args){
HelloThreadr=newHelloThread();Threadt=newThread(r);t.start();}}Thread類構(gòu)造函數(shù)用Runnable的一個(gè)實(shí)例來創(chuàng)建一個(gè)線程啟動(dòng)線程線程類實(shí)現(xiàn)Runnable接口,并重寫run()方法運(yùn)行結(jié)果:Hello0Hello1Hello2Hello3Hello4Hello5多線程--前例改進(jìn)一下
classHelloThreadimplements
Runnable{inti;publicvoidrun(){//重寫Runnable接口的run()方法i=0;while(true){
System.out.println("當(dāng)前線程:"+Thread.currentThread().getName());
System.out.println("Hello"+i++);if(i>5)break;
}
}}publicclasstestThread{publicstaticvoidmain(String[]args){
HelloThreadr=newHelloThread();
Threadt1=newThread(r);t1.start();Threadt2=newThread(r);t2.start();}}新加語句2個(gè)線程當(dāng)前線程:Thread-0當(dāng)前線程:Thread-1Hello0當(dāng)前線程:Thread-0Hello1Hello2當(dāng)前線程:Thread-1Hello3當(dāng)前線程:Thread-1Hello4當(dāng)前線程:Thread-1Hello5當(dāng)前線程:Thread-0Hello6一個(gè)可能的結(jié)果本例中兩個(gè)線程共享數(shù)據(jù)和代碼【Return】8.3線程同步由于同一進(jìn)程的多個(gè)線程共享同一片存儲(chǔ)空間,在帶來方便的同時(shí),也帶來了訪問沖突這個(gè)嚴(yán)重的問題。理解同步:有只蘋果,我拿起來咬一口,放下,你再拿起咬一口,這就是同步。要是大家一起咬,呵呵…類中有一個(gè)私有成員:一個(gè)蘋果,兩個(gè)方法:一個(gè)看,一個(gè)吃。
不同步:我一“看”,有一個(gè)蘋果,我“吃”四分之一;你一“看”,有一個(gè)蘋果,也“吃”四分之一??赡艿那闆r是你只能吃到3/4的1/4。
同步:我在吃的時(shí)候你看被鎖,等吃完了,你再看,啊3/4個(gè)蘋果,那就吃1/3好了,就這樣你也吃了1/4!synchronized關(guān)鍵字synchronized修飾代碼塊時(shí),一個(gè)時(shí)間內(nèi)只能有一個(gè)線程得到執(zhí)行。另一個(gè)線程必須等待當(dāng)前線程執(zhí)行完這個(gè)代碼塊以后才能執(zhí)行該代碼塊。synchronized修飾某個(gè)方法時(shí),表明該方法只能有一個(gè)線程執(zhí)行,其他線程處于等待狀態(tài)。synchronized修飾某個(gè)類的聲明時(shí),表明這類中的所有方法都是synchronized的。示例--同步代碼塊classHelloThreadimplementsRunnable{inti;publicvoidrun(){//重寫Runnable接口的run()方法synchronized(this){i=0;while(true){System.out.println("當(dāng)前線程:"+Thread.currentThread().getName());System.out.println("Hello"+i++);if(i>5)break;}}
}}改寫前例觀察運(yùn)行結(jié)果(見后)注意寫法當(dāng)前線程:Thread-0Hello0當(dāng)前線程:Thread-0Hello1當(dāng)前線程:Thread-0Hello2當(dāng)前線程:Thread-0Hello3當(dāng)前線程:Thread-0Hello4當(dāng)前線程:Thread-0Hello5當(dāng)前線程:Thread-1Hello0當(dāng)前線程:Thread-1Hello1當(dāng)前線程:Thread-1Hello2當(dāng)前線程:Thread-1Hello3當(dāng)前線程:Thread-1Hello4當(dāng)前線程:Thread-1Hello5同步代碼塊運(yùn)行結(jié)果第二個(gè)線程等待第一個(gè)線程結(jié)束后才能訪問同步代碼塊示例--同步方法classHelloThreadimplementsRunnable
inti=0;
synchronized
publicvoidshow(){
System.out.println("當(dāng)前線程:"+Thread.currentThread().getName()); System.out.println("Hello"+i++);
}
publicvoidrun(){
while(true){
show(); if(i>5)break; } }}改寫前例觀察運(yùn)行結(jié)果注意區(qū)別前例當(dāng)前線程:Thread-0Hello0當(dāng)前線程:Thread-0Hello1當(dāng)前線程:Thread-0Hello2當(dāng)前線程:Thread-0Hello3當(dāng)前線程:Thread-0Hello4當(dāng)前線程:Thread-0Hello5當(dāng)前線程:Thread-1Hello6【Return】第二個(gè)線程等待第一個(gè)線程結(jié)束后才能訪問同步方法注意寫法8.4線程間協(xié)作通常,多線程之間需要協(xié)調(diào)工作。例如,瀏覽器的一個(gè)顯示圖片的線程displayThread想要執(zhí)行顯示圖片的任務(wù),必須等待下載線程downloadThread將該圖片下載完畢。如果圖片還沒有下載完,displayThread可以暫停,當(dāng)downloadThread完成了任務(wù)后,再通知displayThread“圖片準(zhǔn)備完畢,可以顯示了”,這時(shí),displayThread繼續(xù)執(zhí)行。簡(jiǎn)單的說就是:如果條件不滿足,則等待。當(dāng)條件滿足時(shí),等待該條件的線程將被喚醒。在Java中,這個(gè)機(jī)制的實(shí)現(xiàn)依賴于wait/notify。wait/notify描述synchronized(obj){while(!condition){
obj.wait();}obj.doSomething();}synchronized(obj){
condition=true;
obj.notify();}在另一線程B中,如果B使得線程A的condition條件滿足了,就可以喚醒線程A。當(dāng)線程A獲得了obj后,發(fā)現(xiàn)條件condition不滿足,無法繼續(xù)下一處理,于是線程A就wait()。wait()、notify()、notifyAll()wait():釋放已持有的鎖,進(jìn)入wait隊(duì)伍。notify():?jiǎn)拘褀ai
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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年度跨境電商平臺(tái)區(qū)域代理合同范本3篇
- 2024年生物醫(yī)藥企業(yè)股權(quán)收購(gòu)合同匯編3篇
- 淘寶找建筑課程設(shè)計(jì)
- 專題03 閱讀理解之推理判斷題(練習(xí))(解析版)
- 煉鋼廠部門崗位職責(zé)說明書
- 機(jī)電工程施工組織設(shè)計(jì)
- (一)高標(biāo)準(zhǔn)農(nóng)田施工方案
- 油條配方課程設(shè)計(jì)
- 糖果罐子手工課程設(shè)計(jì)
- 算法課程設(shè)計(jì)總結(jié)
- 無菌技術(shù)操作評(píng)分標(biāo)準(zhǔn)
- 《社群運(yùn)營(yíng)》全套教學(xué)課件
- 兒童版畫(版畫基礎(chǔ))
- 中央2024年國(guó)家國(guó)防科工局重大專項(xiàng)工程中心面向應(yīng)屆生招聘筆試歷年典型考題及考點(diǎn)附答案解析
- 車輛提檔委托書樣本
- 充值消費(fèi)返利合同范本
- 宜賓市敘州區(qū)2022-2023學(xué)年七年級(jí)上學(xué)期期末數(shù)學(xué)試題
- 國(guó)開政治學(xué)原理2024春期末綜合練習(xí)題(附答案)
- GB/T 18488-2024電動(dòng)汽車用驅(qū)動(dòng)電機(jī)系統(tǒng)
- 裝配式混凝土建筑預(yù)制疊合板、疊合梁識(shí)圖
- 醫(yī)療科研數(shù)據(jù)管理制度
評(píng)論
0/150
提交評(píng)論