JAVA程序員培訓(xùn)定制課程c13.ppt_第1頁
JAVA程序員培訓(xùn)定制課程c13.ppt_第2頁
JAVA程序員培訓(xùn)定制課程c13.ppt_第3頁
JAVA程序員培訓(xùn)定制課程c13.ppt_第4頁
JAVA程序員培訓(xùn)定制課程c13.ppt_第5頁
已閱讀5頁,還剩26頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第十三章,線 程,2,本章內(nèi)容,線程的概念模型 線程的創(chuàng)建和啟動(dòng) 線程的狀態(tài)控制 臨界資源、對象鎖和死鎖 線程的互斥和同步,3,什么是線程,線程是一個(gè)程序內(nèi)部的順序控制流。 線程和進(jìn)程 每個(gè)進(jìn)程都有獨(dú)立的代碼和數(shù)據(jù)空間(進(jìn)程上下文),進(jìn)程切換的開銷大。 線程: 輕量的進(jìn)程,同一類線程共享代碼和數(shù)據(jù)空間,每個(gè)線程有獨(dú)立的運(yùn)行棧和程序計(jì)數(shù)器(PC),線程切換的開銷小。 多進(jìn)程: 在操作系統(tǒng)中能同時(shí)運(yùn)行多個(gè)任務(wù)(程序) 多線程: 在同一應(yīng)用程序中有多個(gè)順序流同時(shí)執(zhí)行,4,線程的概念模型,虛擬的CPU,由java.lang.Thread類封裝和虛擬 CPU所執(zhí)行的代碼,傳遞給Thread類對象。 CP

2、U所處理的數(shù)據(jù),傳遞給Thread類對象。,代 碼,數(shù) 據(jù),虛擬CPU,Java線程模型,5,線程體,Java的線程是通過java.lang.Thread類來實(shí)現(xiàn)的。 每個(gè)線程都是通過某個(gè)特定Thread對象所對應(yīng)的方法run( )來完成其操作的,方法run( )稱為線程體。,6,創(chuàng)建線程 -通過實(shí)現(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中引入線程機(jī)制的目的在于實(shí)現(xiàn)多線程 可以使用同一個(gè)Runnable接口(的實(shí)現(xiàn)類)類型的實(shí)例構(gòu)造多個(gè)線程 多線程之間可以共享代碼和數(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,啟動(dòng)線程,使用start() 方法啟動(dòng)線程 啟動(dòng)線程是使線程進(jìn)入到可運(yùn)行(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、運(yùn)行M13-6頁的例子,體會通過實(shí)現(xiàn)Runnable接口創(chuàng)建線程的過程; 細(xì)化M13-16頁程序,體會并實(shí)現(xiàn)通過繼承Thread類創(chuàng)建線程,并要求實(shí)現(xiàn)下述輸出結(jié)果:連續(xù)輸出26個(gè)大寫字母A Z ;,19,線程的調(diào)度,Java提供一個(gè)線程調(diào)度器來監(jiān)控程序中啟動(dòng)后進(jìn)入就緒狀態(tài)的所有線程。線程調(diào)度器按照線程的優(yōu)先級決定應(yīng)調(diào)度哪些線程來執(zhí)行。 setPriority(int)方法設(shè)置優(yōu)先級 多數(shù)線程的調(diào)度是搶先式的。 時(shí)間片方式 非時(shí)間片方式,20,下面幾種情況下,當(dāng)前線程會放棄CPU: 線程調(diào)用了yield(),suspend()或sleep()方法主動(dòng)放棄; 由于當(dāng)前線程進(jìn)行I/O訪問,外存讀寫,

12、等待用戶輸入等操作,導(dǎo)致線程阻塞; 為等候一個(gè)條件變量,線程調(diào)用wait()方法; 搶先式系統(tǒng)下,有高優(yōu)先級的線程參與調(diào)度;時(shí)間片方式下,當(dāng)前時(shí)間片用完,有同優(yōu)先級的線程參與調(diào)度。,線程的調(diào)度,21,線程的優(yōu)先級,線程的優(yōu)先級用數(shù)字來表示,范圍從1到10,一個(gè)線程的缺省優(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; 兩個(gè)線程A和B在同時(shí)操縱Stack類的同一個(gè)實(shí)例(堆棧),A正在往堆棧里push一個(gè)數(shù)據(jù),B則要從堆棧中pop一個(gè)數(shù)據(jù)。,23,1. 操作之前 data = | a | b | | | | | idx=2 2.A執(zhí)行push中的第一個(gè)語句,將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的第二個(gè)語句: data = | a | b | c | | | | idx=2 最后的結(jié)果相當(dāng)于c沒有入棧,產(chǎn)生這種問題的原因在于對共享數(shù)據(jù)訪問的操作的不完整性。,臨界資源問題(2),24,在Java語言中,引入了對象互斥鎖的概念,來保證共享數(shù)據(jù)操作的完整性。 每個(gè)對象都對應(yīng)于一個(gè)可稱為“互斥鎖”的標(biāo)記,這個(gè)標(biāo)記用來保證在任一時(shí)刻,只能有一個(gè)線程訪問該對象。 關(guān)鍵字synchronized 來與對象的互斥鎖聯(lián)系。當(dāng)某個(gè)對象用synchroniz

15、ed修飾時(shí),表明該對象在任一時(shí)刻只能由一個(gè)線程訪問。,互斥鎖,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í)行外,還可以放在方法聲明中,表示整個(gè)方法為同步方法。 public synchronized void push(char c) 如果synchro

16、nized用在類聲明中,則表明該類中的所有方法都是synchronized的。 public synchronized class Stack ,27,實(shí)現(xiàn)多線程的同步,class SyncStack /支持多線程同步操作的堆棧的實(shí)現(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)者-消費(fèi)者問題(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,消費(fèi)者: 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(消費(fèi): +c); try Thread.sleep(int)(Math.random()*1000); catch(InterruptedException e) ,生產(chǎn)者-消費(fèi)者問題(2),30,生產(chǎn)者-消費(fèi)者問題(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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論