




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第十三章,線 程,2,本章內(nèi)容,線程的概念模型 線程的創(chuàng)建和啟動 線程的狀態(tài)控制 臨界資源、對象鎖和死鎖 線程的互斥和同步,3,什么是線程,線程是一個程序內(nèi)部的順序控制流。 線程和進程 每個進程都有獨立的代碼和數(shù)據(jù)空間(進程上下文),進程切換的開銷大。 線程: 輕量的進程,同一類線程共享代碼和數(shù)據(jù)空間,每個線程有獨立的運行棧和程序計數(shù)器(PC),線程切換的開銷小。 多進程: 在操作系統(tǒng)中能同時運行多個任務(wù)(程序) 多線程: 在同一應(yīng)用程序中有多個順序流同時執(zhí)行,4,線程的概念模型,虛擬的CPU,由java.lang.Thread類封裝和虛擬 CPU所執(zhí)行的代碼,傳遞給Thread類對象。 CP
2、U所處理的數(shù)據(jù),傳遞給Thread類對象。,代 碼,數(shù) 據(jù),虛擬CPU,Java線程模型,5,線程體,Java的線程是通過java.lang.Thread類來實現(xiàn)的。 每個線程都是通過某個特定Thread對象所對應(yīng)的方法run( )來完成其操作的,方法run( )稱為線程體。,6,創(chuàng)建線程 -通過實現(xiàn)Runnable接口,public class TestThread1 public static void main(String args) Runner1 r = new Runner1(); Thread t = new Thread(r); t.start(); class Runner
3、1 implements Runnable public void run() for(int i=0; i30; i+) System.out.println(No. + i); ,7,多線程,Java中引入線程機制的目的在于實現(xiàn)多線程 可以使用同一個Runnable接口(的實現(xiàn)類)類型的實例構(gòu)造多個線程 多線程之間可以共享代碼和數(shù)據(jù) 舉例 Thread t1 = new Thread(r); Thread t2 = new Thread(r);,8,多線程舉例,public class TestThread2 public static void main(String args) Run
4、ner2 r = new Runner2(); Thread t1 = new Thread(r); Thread t2 = new Thread(r); t1.start(); t2.start(); class Runner2 implements Runnable public void run() for(int i=0; i30; i+) System.out.println(No. + i); ,9,多線程共享數(shù)據(jù)和代碼,class MyRunner implements Runnable class YourRunner implements Runnable MyRunner
5、m = new MyRunner(); YourRunner y1 = new YourRunner(); YourRunner y2 = new YourRunner(); Thread t1 = new Thread(m); Thread t2 = new Thread(y1); Thread t3 = new Thread(y2); Thread t4 = new Thread(y2);,10,啟動線程,使用start() 方法啟動線程 啟動線程是使線程進入到可運行(runnable)狀態(tài),并不一定立即開始執(zhí)行該線程 public class TestThread1 public sta
6、tic void main(String args) Runner1 r = new Runner1(); Thread t = new Thread(r); t.start(); ,11,線程狀態(tài)轉(zhuǎn)換(Thread Scheduling),12,線程狀態(tài)轉(zhuǎn)換舉例,public class TestThread3 public static void main(String args) Runner3 r = new Runner3(); Thread t = new Thread(r); t.start(); class Runner3 implements Runnable public
7、void run() for(int i=0; i30; i+) if(i%10=0 ,13,終止線程控制舉例,public class TestThread4 public static void main(String args) Runner4 r = new Runner4(); Thread t = new Thread(r); t.start(); for(int i=0;i0) System.out.println(in thread main i= + i); System.out.println(Thread main is over); r.shutDown(); clas
8、s Runner4 implements Runnable private boolean flag=true; public void run() int i = 0; while (flag=true) System.out.print( + i+); public void shutDown() flag = false; ,14,線程控制基本方法,15,join方法用法舉例,public class TestThread5 public static void main(String args) Runner5 r = new Runner5(); Thread t = new Thr
9、ead(r); t.start(); try t.join(); catch(InterruptedException e) for(int i=0;i50;i+) System.out.println(主線程: + i); class Runner5 implements Runnable public void run() for(int i=0;i50;i+) System.out.println(SubThread: + i); ,16,創(chuàng)建線程的第二種方式 -繼承Thread類,public class TestThread6 public static void main(Stri
10、ng args) Thread t = new Runner6(); t.start(); class Runner6 extends Thread public void run() for(int i=0;i50;i+) System.out.println(SubThread: + i); ,17,兩種創(chuàng)建線程方法的比較,使用Runnable接口 可以將CPU,代碼和數(shù)據(jù)分開,形成清晰的模型; 還可以從其他類繼承; 保持程序風(fēng)格的一致性。 直接繼承Thread類 不能再從其他類繼承; 編寫簡單,可以直接操縱線程,無需使用Thread.currentThread()。,18,Ex1,分析并
11、運行M13-6頁的例子,體會通過實現(xiàn)Runnable接口創(chuàng)建線程的過程; 細化M13-16頁程序,體會并實現(xiàn)通過繼承Thread類創(chuàng)建線程,并要求實現(xiàn)下述輸出結(jié)果:連續(xù)輸出26個大寫字母A Z ;,19,線程的調(diào)度,Java提供一個線程調(diào)度器來監(jiān)控程序中啟動后進入就緒狀態(tài)的所有線程。線程調(diào)度器按照線程的優(yōu)先級決定應(yīng)調(diào)度哪些線程來執(zhí)行。 setPriority(int)方法設(shè)置優(yōu)先級 多數(shù)線程的調(diào)度是搶先式的。 時間片方式 非時間片方式,20,下面幾種情況下,當(dāng)前線程會放棄CPU: 線程調(diào)用了yield(),suspend()或sleep()方法主動放棄; 由于當(dāng)前線程進行I/O訪問,外存讀寫,
12、等待用戶輸入等操作,導(dǎo)致線程阻塞; 為等候一個條件變量,線程調(diào)用wait()方法; 搶先式系統(tǒng)下,有高優(yōu)先級的線程參與調(diào)度;時間片方式下,當(dāng)前時間片用完,有同優(yōu)先級的線程參與調(diào)度。,線程的調(diào)度,21,線程的優(yōu)先級,線程的優(yōu)先級用數(shù)字來表示,范圍從1到10,一個線程的缺省優(yōu)先級是5 Thread.MIN_PRIORITY = 1 Thread.MAX_PRIORITY = 10 Thread.NORM_PRIORITY = 5 使用下述線方法獲得或設(shè)置線程對象的優(yōu)先級 int getPriority(); void setPriority(int newPriority);,22,臨界資源問題(
13、1),class Stack int idx=0; char data = new char6; public void push(char c) dataidx = c; idx+; public char pop() idx-; return dataidx; 兩個線程A和B在同時操縱Stack類的同一個實例(堆棧),A正在往堆棧里push一個數(shù)據(jù),B則要從堆棧中pop一個數(shù)據(jù)。,23,1. 操作之前 data = | a | b | | | | | idx=2 2.A執(zhí)行push中的第一個語句,將c推入堆棧; data = | a | b | c | | | | idx=2 3.A還未執(zhí)
14、行idx+語句,A的執(zhí)行被B中斷,B執(zhí)行pop方法,返回b: data = | a | b | c | | | | idx=1 4.A繼續(xù)執(zhí)行push的第二個語句: data = | a | b | c | | | | idx=2 最后的結(jié)果相當(dāng)于c沒有入棧,產(chǎn)生這種問題的原因在于對共享數(shù)據(jù)訪問的操作的不完整性。,臨界資源問題(2),24,在Java語言中,引入了對象互斥鎖的概念,來保證共享數(shù)據(jù)操作的完整性。 每個對象都對應(yīng)于一個可稱為“互斥鎖”的標(biāo)記,這個標(biāo)記用來保證在任一時刻,只能有一個線程訪問該對象。 關(guān)鍵字synchronized 來與對象的互斥鎖聯(lián)系。當(dāng)某個對象用synchroniz
15、ed修飾時,表明該對象在任一時刻只能由一個線程訪問。,互斥鎖,25,關(guān)鍵字Synchronized用法舉例,public void push(char c) synchronized(this) dataidx=c; idx+; public char pop() synchronized(this) idx-; return dataidx; ,26,關(guān)鍵字Synchronized,synchronized 除了象上面放在對象前面限制一段代碼的執(zhí)行外,還可以放在方法聲明中,表示整個方法為同步方法。 public synchronized void push(char c) 如果synchro
16、nized用在類聲明中,則表明該類中的所有方法都是synchronized的。 public synchronized class Stack ,27,實現(xiàn)多線程的同步,class SyncStack /支持多線程同步操作的堆棧的實現(xiàn) private int index = 0; private char data = new char6; public synchronized void push(char c) while(index = data.length) try this.wait(); catch(InterruptedException e) this.notify(); d
17、ataindex = c; index+; public synchronized char pop() while(index =0) try this.wait(); catch(InterruptedException e) this.notify(); index-; return dataindex; ,28,生產(chǎn)者-消費者問題(1),生產(chǎn)者: class Producer implements Runnable SyncStack stack; public Producer(SyncStack s) stack = s; public void run() for(int i=0
18、; i20; i+) char c =(char)(Math.random()*26+A); stack.push(c); System.out.println(生產(chǎn):+c); try Thread.sleep(int)(Math.random()*100); catch(InterruptedException e) ,29,消費者: class Consumer implements Runnable SyncStack stack; public Consumer(SyncStack s) stack = s; public void run() for(int i=0;i20;i+) char c = stack.pop(); System.out.println(消費: +c); try Thread.sleep(int)(Math.random()*1000); catch(InterruptedException e) ,生產(chǎn)者-消費者問題(2),30,生產(chǎn)者-消費者問題(3),主程序: public class SyncTest publi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030中國逆變電池行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 2025-2030中國進口食品標(biāo)簽行業(yè)市場發(fā)展現(xiàn)狀及前景趨勢與投資研究報告
- 2025-2030中國資產(chǎn)完整性管理系統(tǒng)(AIMS)行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 2025-2030中國貨盤行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 2025-2030中國谷物裝卸系統(tǒng)行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 2025-2030中國解酒飲料行業(yè)發(fā)展分析及投資前景預(yù)測研究報告
- 2025-2030中國西米硅酮口服液行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 2025-2030中國袖子標(biāo)簽行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 2025-2030中國螺紋鋼行業(yè)發(fā)展分析及發(fā)展前景與投資研究報告
- 2025-2030中國茶藝會館行業(yè)發(fā)展分析及發(fā)展趨勢預(yù)測報告
- 2023年北京市農(nóng)林科學(xué)院事業(yè)單位招聘(共500題含答案解析)筆試歷年難、易錯考點試題含答案附詳解
- 尿崩癥診療規(guī)范內(nèi)科學(xué)診療規(guī)范診療指南2023版
- 3D打印實訓(xùn)指導(dǎo)書
- 除草機器人簡介
- 當(dāng)代文學(xué)第一章1949-1966年的文學(xué)思潮
- 抽油井檢泵作業(yè)課件
- a320飛機空調(diào)系統(tǒng)工作原理與使用維護分析
- 施工機具進場檢查驗收記錄
- 《液壓與氣動技術(shù)項目教程》高職配套教學(xué)課件
- 2022年七步洗手法操作考核評分標(biāo)準(zhǔn)
- 過敏性紫癜的護理PPT課件(PPT 33頁)
評論
0/150
提交評論