java雍俊海_ch11_線程_第1頁(yè)
java雍俊海_ch11_線程_第2頁(yè)
java雍俊海_ch11_線程_第3頁(yè)
java雍俊海_ch11_線程_第4頁(yè)
java雍俊海_ch11_線程_第5頁(yè)
已閱讀5頁(yè),還剩42頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第 11 章 多線程本章概述 Windows等操作系統(tǒng)支持多線程進(jìn)程的并發(fā)處理機(jī)制,提高系統(tǒng)效率,改善資源利用率。 多線程并發(fā)程序設(shè)計(jì):一個(gè)程序分成若干個(gè)并發(fā)執(zhí)行的進(jìn)程,一個(gè)進(jìn)程再分成若干并發(fā)執(zhí)行的線程(多處理器系統(tǒng)并行處理)。 Java提供線程類和接口,用于創(chuàng)建、管理和控制線程對(duì)象。學(xué)習(xí)目標(biāo) 理解進(jìn)程和線程的概念,掌握創(chuàng)建、管理和控制Java線程對(duì)象的方法 創(chuàng)建線程對(duì)象創(chuàng)建線程對(duì)象 改變線程狀態(tài)改變線程狀態(tài) 設(shè)置線程優(yōu)先級(jí),控制線程調(diào)度設(shè)置線程優(yōu)先級(jí),控制線程調(diào)度 了解并發(fā)執(zhí)行的多線程間存在的各種不同關(guān)系,掌握實(shí)現(xiàn)線程互斥和線程同步的方法本章總體綱要 11.1 操作系統(tǒng)中的進(jìn)程和線程 11.

2、2 Java的線程對(duì)象 11.3 線程同步機(jī)制進(jìn)程進(jìn)程1.進(jìn)程的定義和屬性進(jìn)程的定義和屬性進(jìn)程(進(jìn)程(process):可并發(fā)執(zhí)行且具有獨(dú)立功能的程序):可并發(fā)執(zhí)行且具有獨(dú)立功能的程序(program)關(guān)于某個(gè)數(shù)據(jù)集合的一次執(zhí)行過程,也是)關(guān)于某個(gè)數(shù)據(jù)集合的一次執(zhí)行過程,也是操作系統(tǒng)進(jìn)行資源分配和保護(hù)的基本單位。操作系統(tǒng)進(jìn)行資源分配和保護(hù)的基本單位。 結(jié)構(gòu)性:進(jìn)程包括程序塊、數(shù)據(jù)塊和進(jìn)程控制塊結(jié)構(gòu)性:進(jìn)程包括程序塊、數(shù)據(jù)塊和進(jìn)程控制塊n進(jìn)程控制塊(PCB)用于描述和記錄進(jìn)程的動(dòng)態(tài)變化過程使進(jìn)程能正確運(yùn)行。共享性:不同進(jìn)程可共享相同程序,運(yùn)行于不同數(shù)據(jù)集共享性:不同進(jìn)程可共享相同程序,運(yùn)行于不同

3、數(shù)據(jù)集合上合上動(dòng)態(tài)性動(dòng)態(tài)性n進(jìn)程是程序在數(shù)據(jù)集上的一次執(zhí)行過程,是動(dòng)態(tài)概念。它具有聲明周期,由創(chuàng)建而產(chǎn)生,由調(diào)度而執(zhí)行,由撤銷而消亡。n程序是一組有序指令序列,是靜態(tài)概念,程序作為系統(tǒng)資源可永久存在。進(jìn)程進(jìn)程獨(dú)立性獨(dú)立性n進(jìn)程是系統(tǒng)中資源分配和保護(hù)的基本單位,系統(tǒng)調(diào)度的基本單位。并發(fā)性并發(fā)性n一組進(jìn)程輪流占用處理器并發(fā)地執(zhí)行,進(jìn)程可能被中斷和恢復(fù)執(zhí)行。制約性制約性進(jìn)程在進(jìn)行的關(guān)鍵點(diǎn)上需要相互等待或互通消息,以保證程序執(zhí)行的可再現(xiàn)性和計(jì)算結(jié)果的唯一性。進(jìn)程進(jìn)程進(jìn)程的狀態(tài)進(jìn)程的狀態(tài)就緒(就緒(ready)態(tài))態(tài)n進(jìn)程具備運(yùn)行條件,等待系統(tǒng)分配處理器以便運(yùn)行。運(yùn)行(運(yùn)行(running)態(tài))態(tài)n進(jìn)程

4、占用處理器正在運(yùn)行。阻塞(阻塞(blocked)態(tài))態(tài) n進(jìn)程不具備運(yùn)行條件,正在等待某個(gè)事件的完成。線程線程1.引入線程機(jī)制的動(dòng)機(jī)和思路引入線程機(jī)制的動(dòng)機(jī)和思路早期操作系統(tǒng)(早期操作系統(tǒng)(MS-DOS和早期和早期UNIX)的進(jìn)程結(jié)構(gòu))的進(jìn)程結(jié)構(gòu)n單線程進(jìn)程:任一時(shí)刻只有一個(gè)執(zhí)行控制流n缺點(diǎn):時(shí)空開銷大,并行能力不足線程機(jī)制基本思路線程機(jī)制基本思路n把進(jìn)程的兩項(xiàng)功能(“獨(dú)立分配資源”和“被調(diào)度分派執(zhí)行”)分離n前一項(xiàng)功能由進(jìn)程完成,后一項(xiàng)由線程完成n引入線程后,進(jìn)程只負(fù)責(zé)分配和保護(hù)資源,就不需要頻繁切換;線程負(fù)責(zé)調(diào)度分派,可以頻繁調(diào)度和切換。線程線程2. 線程的定義和屬性線程的定義和屬性線程(

5、線程(thread)是操作系統(tǒng)進(jìn)程中能夠獨(dú)立執(zhí)行的)是操作系統(tǒng)進(jìn)程中能夠獨(dú)立執(zhí)行的實(shí)體(控制流),是實(shí)體(控制流),是處理器調(diào)度和分派處理器調(diào)度和分派的基本單的基本單位。位。 并發(fā)性:可在一個(gè)并發(fā)性:可在一個(gè)/多個(gè)處理器上并行執(zhí)行多個(gè)處理器上并行執(zhí)行共享性共享性n同一進(jìn)程的所有線程共享進(jìn)程的狀態(tài)和資源n駐留在進(jìn)程的同一個(gè)主存地址空間中n可以訪問相同的數(shù)據(jù)n進(jìn)程間需要通信和同步互斥機(jī)制線程線程動(dòng)態(tài)性動(dòng)態(tài)性程序在數(shù)據(jù)集上的一次動(dòng)態(tài)執(zhí)行過程程序在數(shù)據(jù)集上的一次動(dòng)態(tài)執(zhí)行過程創(chuàng)建進(jìn)程的同時(shí),至少為其創(chuàng)建一個(gè)線程創(chuàng)建進(jìn)程的同時(shí),至少為其創(chuàng)建一個(gè)線程結(jié)構(gòu)性結(jié)構(gòu)性線程是操作系統(tǒng)的基本調(diào)度和分派單位線程是操作系

6、統(tǒng)的基本調(diào)度和分派單位具有唯一的標(biāo)識(shí)符和線程控制塊具有唯一的標(biāo)識(shí)符和線程控制塊線程線程線程的狀態(tài)線程的狀態(tài)線程具有聲明周期,線程的線程具有聲明周期,線程的5種狀態(tài)種狀態(tài)及狀態(tài)轉(zhuǎn)換及狀態(tài)轉(zhuǎn)換進(jìn)程有三種狀態(tài)(就緒、運(yùn)行、阻塞)進(jìn)程有三種狀態(tài)(就緒、運(yùn)行、阻塞) 新建態(tài)就緒態(tài)運(yùn)行態(tài)等待態(tài)(阻塞)終止態(tài)選中出現(xiàn)等待事件落選等待事件結(jié)束線程線程4. 線程的并發(fā)性線程的并發(fā)性宏觀上看,并發(fā)性反映一個(gè)時(shí)間段中的幾個(gè)線程宏觀上看,并發(fā)性反映一個(gè)時(shí)間段中的幾個(gè)線程都處于都處于運(yùn)行但未結(jié)束運(yùn)行但未結(jié)束的狀態(tài)。的狀態(tài)。微觀上看,任一時(shí)刻只有一個(gè)線程運(yùn)行。并發(fā)的微觀上看,任一時(shí)刻只有一個(gè)線程運(yùn)行。并發(fā)的實(shí)質(zhì)是多線程實(shí)

7、質(zhì)是多線程多路復(fù)用處理器多路復(fù)用處理器,提高系統(tǒng)資源利,提高系統(tǒng)資源利用率。用率。5. 線程調(diào)度線程調(diào)度當(dāng)多個(gè)線程處于就緒態(tài)時(shí),它們排隊(duì)等待處理器當(dāng)多個(gè)線程處于就緒態(tài)時(shí),它們排隊(duì)等待處理器資源。資源。操作系統(tǒng)決定如何給不同線程分配處理器,這是操作系統(tǒng)決定如何給不同線程分配處理器,這是線程調(diào)度的任務(wù)。線程調(diào)度的任務(wù)。線程線程線程調(diào)度原則線程調(diào)度原則線程調(diào)度中執(zhí)行分配處理器的程序稱為線程調(diào)度中執(zhí)行分配處理器的程序稱為分派程序分派程序(dispatcher)線程調(diào)度采用剝奪方式,剝奪原則包括兩種:線程調(diào)度采用剝奪方式,剝奪原則包括兩種:高優(yōu)先級(jí)線程剝奪低優(yōu)先級(jí)線程高優(yōu)先級(jí)線程剝奪低優(yōu)先級(jí)線程設(shè)定線程

8、可使用處理器的時(shí)間,用完后剝奪設(shè)定線程可使用處理器的時(shí)間,用完后剝奪就緒態(tài)的線程按優(yōu)先級(jí)排隊(duì),在此基礎(chǔ)上采取就緒態(tài)的線程按優(yōu)先級(jí)排隊(duì),在此基礎(chǔ)上采取“先到先服務(wù)先到先服務(wù)”原則原則順序程序設(shè)計(jì)順序程序設(shè)計(jì)1.順序程序設(shè)計(jì):順序程序設(shè)計(jì):同一程序同一程序/不同程序都按序執(zhí)行不同程序都按序執(zhí)行執(zhí)行的順序性。執(zhí)行的順序性。執(zhí)行結(jié)果的確定性。執(zhí)行結(jié)果的確定性。計(jì)算結(jié)果的可再現(xiàn)性。計(jì)算結(jié)果的可再現(xiàn)性。2.順序程序設(shè)計(jì)的特點(diǎn)順序程序設(shè)計(jì)的特點(diǎn)程序編寫和調(diào)試方便程序編寫和調(diào)試方便效率不高效率不高并發(fā)程序設(shè)計(jì)并發(fā)程序設(shè)計(jì)1.方法:方法:把程序分成若干可同時(shí)執(zhí)行的程序塊,每把程序分成若干可同時(shí)執(zhí)行的程序塊,每個(gè)

9、程序塊和執(zhí)行所需數(shù)據(jù)組成一個(gè)進(jìn)程。個(gè)程序塊和執(zhí)行所需數(shù)據(jù)組成一個(gè)進(jìn)程。2.目的:目的:發(fā)揮硬件并行性,減少發(fā)揮硬件并行性,減少CPU和和I/O交互等交互等待事件,提高系統(tǒng)效率。待事件,提高系統(tǒng)效率。3.特點(diǎn):特點(diǎn):并發(fā)性:多路復(fù)用處理器并發(fā)性:多路復(fù)用處理器共享性:可共享變量,線程通過共享就能交換共享性:可共享變量,線程通過共享就能交換信號(hào)信號(hào)制約性:進(jìn)程并發(fā)執(zhí)行或協(xié)作完成同一任務(wù)時(shí),制約性:進(jìn)程并發(fā)執(zhí)行或協(xié)作完成同一任務(wù)時(shí),會(huì)產(chǎn)生相互制約關(guān)系,要加以協(xié)調(diào)會(huì)產(chǎn)生相互制約關(guān)系,要加以協(xié)調(diào)交互性:由于共享性,一個(gè)程序的執(zhí)行可能影交互性:由于共享性,一個(gè)程序的執(zhí)行可能影響其他程序的執(zhí)行結(jié)果,需要控制

10、它的交互性。響其他程序的執(zhí)行結(jié)果,需要控制它的交互性。并發(fā)程序設(shè)計(jì)并發(fā)程序設(shè)計(jì)1.Java程序中,進(jìn)程從程序中,進(jìn)程從main方法開始執(zhí)行,方法開始執(zhí)行,進(jìn)程只有一個(gè)進(jìn)程只有一個(gè)main線程,稱為主線程。線程,稱為主線程。2.同時(shí),可以在同時(shí),可以在main方法中創(chuàng)建多個(gè)線程對(duì)方法中創(chuàng)建多個(gè)線程對(duì)象并啟動(dòng)線程對(duì)象執(zhí)行象并啟動(dòng)線程對(duì)象執(zhí)行(多線程并發(fā)執(zhí)行多線程并發(fā)執(zhí)行)。3.Java提供內(nèi)置多線程機(jī)制,提供內(nèi)置多線程機(jī)制,java.lang.Thread類提供線程處理功能。類提供線程處理功能。11.2 Java的線程對(duì)象的線程對(duì)象1.Runnable接口與接口與Thread類類2.線程對(duì)象的生命

11、周期線程對(duì)象的生命周期3.線程對(duì)象的優(yōu)先級(jí)線程對(duì)象的優(yōu)先級(jí)Runnable接口與接口與Thread類類nThread類用于創(chuàng)建和控制線程,線程對(duì)象執(zhí)行類用于創(chuàng)建和控制線程,線程對(duì)象執(zhí)行的方法是的方法是Runnable接口中的接口中的run()方法,線程方法,線程必須從必須從run()方法開始執(zhí)行方法開始執(zhí)行(如同應(yīng)用程序從如同應(yīng)用程序從main方法開始執(zhí)行方法開始執(zhí)行)。n線程對(duì)象必須實(shí)現(xiàn)線程對(duì)象必須實(shí)現(xiàn)run()方法來描述該線程的所方法來描述該線程的所有活動(dòng)及執(zhí)行的操作。有活動(dòng)及執(zhí)行的操作。1.Runnable接口接口public interface Runnable public abst

12、ract void run();Thread線程類線程類public class Thread extends Object implements Runnable public Thread() /構(gòu)造方法構(gòu)造方法 public Thread(String name) /name指定指定線程名線程名 public Thread(Runnable target) /target指定線程的目標(biāo)對(duì)象指定線程的目標(biāo)對(duì)象 public Thread(Runnable target, String name) public void run() /描述線程操作的描述線程操作的線程體線程體 public

13、final String getName() /返回線程名返回線程名 public final void setName(String name) /設(shè)置線程名設(shè)置線程名 public static int activeCount() /返回當(dāng)前活動(dòng)線程個(gè)數(shù)返回當(dāng)前活動(dòng)線程個(gè)數(shù) public static Thread currentThread() /返回當(dāng)前執(zhí)行線程對(duì)象返回當(dāng)前執(zhí)行線程對(duì)象 public String toString() /返回線程的字符串信息,包括名字、優(yōu)先級(jí)和線程組返回線程的字符串信息,包括名字、優(yōu)先級(jí)和線程組 public synchronized void sta

14、rt() /啟動(dòng)啟動(dòng)已創(chuàng)建的線程對(duì)象已創(chuàng)建的線程對(duì)象Thread線程類線程類n線程具有唯一標(biāo)識(shí)符,在創(chuàng)建線程對(duì)象時(shí)可線程具有唯一標(biāo)識(shí)符,在創(chuàng)建線程對(duì)象時(shí)可指定線程名指定線程名namen線程對(duì)象的目標(biāo)對(duì)象線程對(duì)象的目標(biāo)對(duì)象targetn指實(shí)現(xiàn)了指實(shí)現(xiàn)了Runnable接口的對(duì)象接口的對(duì)象n如果沒有目標(biāo)對(duì)象,表明由線程對(duì)象本身提供線如果沒有目標(biāo)對(duì)象,表明由線程對(duì)象本身提供線程執(zhí)行的程執(zhí)行的run()方法方法nJava提供兩種實(shí)現(xiàn)多線程程序設(shè)計(jì)的方法提供兩種實(shí)現(xiàn)多線程程序設(shè)計(jì)的方法n繼承繼承Thread類類n實(shí)現(xiàn)實(shí)現(xiàn)Runnable接口接口多線程實(shí)現(xiàn)例程多線程實(shí)現(xiàn)例程n例例1 聲明繼承聲明繼承Thr

15、ead類實(shí)現(xiàn)奇數(shù)類實(shí)現(xiàn)奇數(shù)/偶數(shù)序列偶數(shù)序列的線程并發(fā)執(zhí)行的線程并發(fā)執(zhí)行(NumberThread.java)創(chuàng)建并啟動(dòng)線程,線程由系統(tǒng)調(diào)度執(zhí)行主線程main() thread_odd.start(); thread_even.start();thread_oddrun() /產(chǎn)生奇數(shù)序列thread_evenrun() /產(chǎn)生偶數(shù)序列系統(tǒng)執(zhí)行多線程實(shí)現(xiàn)例程多線程實(shí)現(xiàn)例程n例程說明例程說明nmain是首先啟動(dòng)執(zhí)行的線程,而且執(zhí)行時(shí)間短是首先啟動(dòng)執(zhí)行的線程,而且執(zhí)行時(shí)間短n實(shí)例對(duì)象調(diào)用實(shí)例對(duì)象調(diào)用start方法啟動(dòng)線程,執(zhí)行各自的方法啟動(dòng)線程,執(zhí)行各自的run方法方法nThread類中多種成員方

16、法的作用類中多種成員方法的作用n線程運(yùn)行結(jié)果具有不確定性,多次運(yùn)行后可能得線程運(yùn)行結(jié)果具有不確定性,多次運(yùn)行后可能得到不同的輸出序列值到不同的輸出序列值n線程啟動(dòng)后不馬上運(yùn)行,要等待線程啟動(dòng)后不馬上運(yùn)行,要等待OS調(diào)度執(zhí)行。調(diào)度執(zhí)行。因此,線程何時(shí)執(zhí)行、執(zhí)行次序及是否被打斷不因此,線程何時(shí)執(zhí)行、執(zhí)行次序及是否被打斷不由程序控制由程序控制n兩個(gè)線程交替執(zhí)行,交替輸出序列值(可能)兩個(gè)線程交替執(zhí)行,交替輸出序列值(可能)例程例程2:聲明實(shí)現(xiàn)聲明實(shí)現(xiàn)Runnable接口實(shí)現(xiàn)奇數(shù)接口實(shí)現(xiàn)奇數(shù)/偶偶數(shù)序列的線程并發(fā)執(zhí)行數(shù)序列的線程并發(fā)執(zhí)行(NumberRunnable.java)n例程說明例程說明nNu

17、mberRunnable類的對(duì)象類的對(duì)象odd不是線程對(duì)象,不是線程對(duì)象,沒有沒有start()等方法,但等方法,但odd具有實(shí)現(xiàn)了的具有實(shí)現(xiàn)了的run方方法,該對(duì)象可作為線程對(duì)象的法,該對(duì)象可作為線程對(duì)象的目標(biāo)對(duì)象,目標(biāo)對(duì)象,然后然后以目標(biāo)對(duì)象創(chuàng)建線程對(duì)象。以目標(biāo)對(duì)象創(chuàng)建線程對(duì)象。n線程對(duì)象線程對(duì)象thread_odd調(diào)用調(diào)用start方法,執(zhí)行該方法,執(zhí)行該線程對(duì)象中的線程對(duì)象中的run方法方法例程例程2:聲明實(shí)現(xiàn)聲明實(shí)現(xiàn)Runnable接口實(shí)現(xiàn)奇數(shù)接口實(shí)現(xiàn)奇數(shù)/偶偶數(shù)序列的線程并發(fā)執(zhí)行數(shù)序列的線程并發(fā)執(zhí)行nThread類的類的run()方法聲明如下:方法聲明如下:public void

18、run() /描述線程操作的線程體描述線程操作的線程體 if (target != null) target.run(); /執(zhí)行目標(biāo)對(duì)象的執(zhí)行目標(biāo)對(duì)象的run()方法方法如果如果target中的中的run為空,則為空,則Thread類對(duì)象的類對(duì)象的run方法為方法為空空如果如果target中的中的run非空,則執(zhí)行非空,則執(zhí)行target對(duì)象的對(duì)象的run方法方法Thread thread_odd = new Thread(odd,奇數(shù)線程奇數(shù)線程); /thread_odd實(shí)際執(zhí)行實(shí)際執(zhí)行odd的的run()方法方法兩種創(chuàng)建線程方式的比較兩種創(chuàng)建線程方式的比較兩個(gè)例程兩個(gè)例程n直接繼承線程

19、直接繼承線程Thread類類n定義定義Thread的子類,并且覆蓋的子類,并且覆蓋Thread的的run方方法作為法作為線程對(duì)象線程對(duì)象實(shí)際執(zhí)行操作實(shí)際執(zhí)行操作n適用于單重繼承,不適于多重繼承適用于單重繼承,不適于多重繼承n實(shí)現(xiàn)實(shí)現(xiàn)Runnable接口接口n定義類定義類odd實(shí)現(xiàn)實(shí)現(xiàn)Runnable接口,其對(duì)象不是線接口,其對(duì)象不是線程對(duì)象,可以作為線程對(duì)象的目標(biāo)對(duì)象程對(duì)象,可以作為線程對(duì)象的目標(biāo)對(duì)象n還需還需聲明線程聲明線程(Thread)對(duì)象(如,對(duì)象(如,Runnable類中的類中的thread_odd對(duì)象)對(duì)象)n適用于多重繼承適用于多重繼承線程對(duì)象的生命周期線程對(duì)象的生命周期1.Th

20、read類中聲明的線程狀態(tài)類中聲明的線程狀態(tài)new創(chuàng)建線程后進(jìn)入新建態(tài),創(chuàng)建線程后進(jìn)入新建態(tài),start啟動(dòng)后進(jìn)入運(yùn)行態(tài),啟動(dòng)后進(jìn)入運(yùn)行態(tài),run結(jié)束后進(jìn)入終止態(tài)結(jié)束后進(jìn)入終止態(tài)處于等待態(tài)處于等待態(tài)WAITING,表示等待時(shí)間不確定,表示等待時(shí)間不確定處于等待態(tài)處于等待態(tài)TIMED_WAITING,表示等待時(shí)間確定,表示等待時(shí)間確定notify()notifyAll()synchronized()wait()NEW新建態(tài)RUNNABLE運(yùn)行態(tài)BLOCKED阻塞態(tài)TERMINATED終止態(tài)sleep時(shí)間到TIMED_WAITING等待態(tài)WAITING等待態(tài)獲得互斥鎖使用權(quán)start()run()

21、結(jié)束sleep()Thread類中改變和判斷線程狀態(tài)的方法類中改變和判斷線程狀態(tài)的方法1.線程啟動(dòng)線程啟動(dòng)public synchronized void start() /啟動(dòng)已創(chuàng)建的線程對(duì)象啟動(dòng)已創(chuàng)建的線程對(duì)象public final boolean isAlive() /返回線程是否啟動(dòng)的狀態(tài)返回線程是否啟動(dòng)的狀態(tài)2.線程睡眠線程睡眠public static void sleep(long millis) throws InterruptedException3.線程中斷線程中斷public void interrupt() /設(shè)置當(dāng)前線程對(duì)象運(yùn)行中斷標(biāo)記設(shè)置當(dāng)前線程對(duì)象運(yùn)行中斷標(biāo)記p

22、ublic boolean isInterrupted() /判斷線程是否中斷判斷線程是否中斷public static boolean interrupted() /判斷線程是否中斷判斷線程是否中斷isInterrupted()測(cè)試線程對(duì)象的中斷標(biāo)記,并不清除中斷標(biāo)記;測(cè)試線程對(duì)象的中斷標(biāo)記,并不清除中斷標(biāo)記;intertupted()測(cè)試當(dāng)前線程是否被中斷,并在肯定的情況下,清除測(cè)試當(dāng)前線程是否被中斷,并在肯定的情況下,清除當(dāng)前線程對(duì)象的中斷標(biāo)記當(dāng)前線程對(duì)象的中斷標(biāo)記例程:例程:WelcomeJFrame.java線程對(duì)象的優(yōu)先級(jí)線程對(duì)象的優(yōu)先級(jí)1.Thread類中聲明了類中聲明了3個(gè)表示

23、優(yōu)先級(jí)的公有靜態(tài)常量:個(gè)表示優(yōu)先級(jí)的公有靜態(tài)常量:public static final int MIN_PRIORITY=1 /最低優(yōu)先級(jí)最低優(yōu)先級(jí)public static final int MAX_PRIORITY=10 /最高優(yōu)先級(jí)最高優(yōu)先級(jí)public static final int NORM_PRIORITY=5 /默認(rèn)優(yōu)先級(jí)默認(rèn)優(yōu)先級(jí)2.Thread類中與線程優(yōu)先級(jí)有關(guān)的方法有以下類中與線程優(yōu)先級(jí)有關(guān)的方法有以下2個(gè):個(gè):public final int getPriority() /獲得線程優(yōu)先級(jí)獲得線程優(yōu)先級(jí)public final void setPriority(in

24、t newPriority)/設(shè)置線程優(yōu)先級(jí)設(shè)置線程優(yōu)先級(jí)n設(shè)置奇數(shù)線程優(yōu)先級(jí)設(shè)置奇數(shù)線程優(yōu)先級(jí)thread_odd.setPriority(10),則奇數(shù)線,則奇數(shù)線程中斷程中斷main線程,待奇數(shù)線程執(zhí)行完后再執(zhí)行線程,待奇數(shù)線程執(zhí)行完后再執(zhí)行main線程。線程。線程的同步機(jī)制線程的同步機(jī)制1.交互線程交互線程2.線程間的競(jìng)爭(zhēng)關(guān)系與線程互斥線程間的競(jìng)爭(zhēng)關(guān)系與線程互斥3.線程間的協(xié)作關(guān)系與線程同步線程間的協(xié)作關(guān)系與線程同步線程的同步機(jī)制線程的同步機(jī)制1.交互交互線程:并發(fā)線程間共享資源或交換數(shù)據(jù)線程:并發(fā)線程間共享資源或交換數(shù)據(jù).2.由于交互線程間會(huì)存在干擾而影響線程的執(zhí)由于交互線程間會(huì)存在

25、干擾而影響線程的執(zhí)行結(jié)果,線程間需要有行結(jié)果,線程間需要有同步同步機(jī)制。機(jī)制。3.交互線程存在兩種關(guān)系:競(jìng)爭(zhēng)關(guān)系和協(xié)作關(guān)交互線程存在兩種關(guān)系:競(jìng)爭(zhēng)關(guān)系和協(xié)作關(guān)系。系。4.競(jìng)爭(zhēng)競(jìng)爭(zhēng)關(guān)系的交互線程需要關(guān)系的交互線程需要互斥互斥解決資源共享解決資源共享沖突問題。沖突問題。5.協(xié)作協(xié)作關(guān)系的交互線程需要關(guān)系的交互線程需要同步同步解決線程間通解決線程間通信速度差異引起的不同步。信速度差異引起的不同步。無關(guān)線程與交互線程無關(guān)線程與交互線程1.無關(guān)線程:并發(fā)線程分別在不同的變量集合無關(guān)線程:并發(fā)線程分別在不同的變量集合上操作,線程間不會(huì)互相干擾。上操作,線程間不會(huì)互相干擾。無關(guān)線程不會(huì)產(chǎn)生與時(shí)間相關(guān)的錯(cuò)誤,

26、相互之間無關(guān)線程不會(huì)產(chǎn)生與時(shí)間相關(guān)的錯(cuò)誤,相互之間不影響。(如,奇數(shù)不影響。(如,奇數(shù)/偶數(shù)例程)偶數(shù)例程)2.交互線程:并發(fā)線程交互線程:并發(fā)線程共享共享某些變量,線程間某些變量,線程間存在存在制約制約關(guān)系。關(guān)系。并發(fā)執(zhí)行的交互線程間存在與時(shí)間有關(guān)的錯(cuò)誤并發(fā)執(zhí)行的交互線程間存在與時(shí)間有關(guān)的錯(cuò)誤執(zhí)行結(jié)果取決于并發(fā)線程的相對(duì)速度執(zhí)行結(jié)果取決于并發(fā)線程的相對(duì)速度無關(guān)線程與交互線程無關(guān)線程與交互線程例程:例程:Account.java 將對(duì)銀行賬戶的存款、取款操作分別設(shè)計(jì)成線將對(duì)銀行賬戶的存款、取款操作分別設(shè)計(jì)成線程,程, 由于存款和取款線程都能夠?qū)ν粋€(gè)賬戶(共由于存款和取款線程都能夠?qū)ν粋€(gè)賬戶

27、(共享變量)數(shù)據(jù)進(jìn)行操作,所以并發(fā)執(zhí)行的多個(gè)存享變量)數(shù)據(jù)進(jìn)行操作,所以并發(fā)執(zhí)行的多個(gè)存款、取款線程間可能會(huì)產(chǎn)生與時(shí)間有關(guān)的錯(cuò)誤???、取款線程間可能會(huì)產(chǎn)生與時(shí)間有關(guān)的錯(cuò)誤。無關(guān)線程與交互線程無關(guān)線程與交互線程例程說明:例程說明:對(duì)同一個(gè)賬戶對(duì)同一個(gè)賬戶Wang創(chuàng)建啟動(dòng)多個(gè)線程創(chuàng)建啟動(dòng)多個(gè)線程(存存/取取),線程對(duì)同一賬戶對(duì)象中的數(shù)據(jù)線程對(duì)同一賬戶對(duì)象中的數(shù)據(jù)(賬戶余額賬戶余額)操作,操作,由于并發(fā)線程與調(diào)度時(shí)間有關(guān),所以結(jié)果不確定由于并發(fā)線程與調(diào)度時(shí)間有關(guān),所以結(jié)果不確定(存存/取線程調(diào)度順序不定,導(dǎo)致所取金額不定取線程調(diào)度順序不定,導(dǎo)致所取金額不定)。線程執(zhí)行被打斷時(shí)出現(xiàn)錯(cuò)誤線程執(zhí)行被打斷時(shí)

28、出現(xiàn)錯(cuò)誤 采用采用sleep(1)方式中斷線程,系統(tǒng)調(diào)度其他線程,方式中斷線程,系統(tǒng)調(diào)度其他線程,導(dǎo)致中斷線程重啟后,賬戶數(shù)據(jù)改變,存在數(shù)據(jù)導(dǎo)致中斷線程重啟后,賬戶數(shù)據(jù)改變,存在數(shù)據(jù)不符。不符。兩個(gè)線程分別對(duì)兩個(gè)不同賬戶兩個(gè)線程分別對(duì)兩個(gè)不同賬戶(Wang、Li)對(duì)象進(jìn)對(duì)象進(jìn)行操作時(shí),線程執(zhí)行不受干擾。行操作時(shí),線程執(zhí)行不受干擾。線程間的競(jìng)爭(zhēng)關(guān)系與線程互斥線程間的競(jìng)爭(zhēng)關(guān)系與線程互斥n線程間的競(jìng)爭(zhēng)關(guān)系線程間的競(jìng)爭(zhēng)關(guān)系訪問同一資源的線程間存在競(jìng)爭(zhēng)關(guān)系。訪問同一資源的線程間存在競(jìng)爭(zhēng)關(guān)系。資源競(jìng)爭(zhēng)出現(xiàn)的兩個(gè)問題資源競(jìng)爭(zhēng)出現(xiàn)的兩個(gè)問題死鎖死鎖(deadlock):):已獲得資源的線程還想獲得其他線已獲得

29、資源的線程還想獲得其他線程的資源導(dǎo)致所有線程陷入死鎖。程的資源導(dǎo)致所有線程陷入死鎖。饑餓(饑餓(starvation):):一個(gè)線程由于其他線程總是優(yōu)于一個(gè)線程由于其他線程總是優(yōu)于自己而被無限期拖延。自己而被無限期拖延。n操作系統(tǒng)要保證多線程能互斥地訪問共享變操作系統(tǒng)要保證多線程能互斥地訪問共享變量(量(臨界資源臨界資源)線程間的競(jìng)爭(zhēng)關(guān)系與線程互斥線程間的競(jìng)爭(zhēng)關(guān)系與線程互斥n線程互斥和臨界區(qū)管理線程互斥和臨界區(qū)管理線程互斥:任何時(shí)刻線程互斥:任何時(shí)刻最多允許一個(gè)最多允許一個(gè)線程訪問共享資線程訪問共享資源源臨界臨界資源:共享變量代表的資源,并發(fā)線程中與臨資源:共享變量代表的資源,并發(fā)線程中與臨界

30、資源有關(guān)的程序段成為界資源有關(guān)的程序段成為臨界區(qū)臨界區(qū)。操作系統(tǒng)對(duì)共享一個(gè)變量的若干線程進(jìn)入各自臨界操作系統(tǒng)對(duì)共享一個(gè)變量的若干線程進(jìn)入各自臨界區(qū)有以下區(qū)有以下3個(gè)調(diào)度原則:個(gè)調(diào)度原則:一次至多一個(gè)線程能夠在它的臨界區(qū)內(nèi)。一次至多一個(gè)線程能夠在它的臨界區(qū)內(nèi)。不能讓一個(gè)線程無限地留在它的臨界區(qū)內(nèi)。不能讓一個(gè)線程無限地留在它的臨界區(qū)內(nèi)。不能強(qiáng)迫一個(gè)線程無限地等待進(jìn)入它的臨界區(qū)。不能強(qiáng)迫一個(gè)線程無限地等待進(jìn)入它的臨界區(qū)。特別地,進(jìn)入臨界區(qū)的任一線程不能妨礙正等待特別地,進(jìn)入臨界區(qū)的任一線程不能妨礙正等待進(jìn)入的其他線程的進(jìn)展。進(jìn)入的其他線程的進(jìn)展。線程間的競(jìng)爭(zhēng)關(guān)系與線程互斥線程間的競(jìng)爭(zhēng)關(guān)系與線程互斥n

31、線程互斥和臨界區(qū)管理線程互斥和臨界區(qū)管理n對(duì)臨界區(qū)的調(diào)度原則:無空等待、有空讓進(jìn)、擇對(duì)臨界區(qū)的調(diào)度原則:無空等待、有空讓進(jìn)、擇一而入、算法可行。一而入、算法可行。n算法可行:所選調(diào)度算法不能造成線程饑餓和死算法可行:所選調(diào)度算法不能造成線程饑餓和死鎖。鎖。nOS提供提供“互斥鎖互斥鎖”機(jī)制互斥訪問臨界資源,實(shí)現(xiàn)機(jī)制互斥訪問臨界資源,實(shí)現(xiàn)互斥的調(diào)度算法很多,都由互斥的調(diào)度算法很多,都由OS和虛擬機(jī)完成,和虛擬機(jī)完成,程程序員只需要在程序中聲明哪個(gè)程序段是臨界區(qū)即序員只需要在程序中聲明哪個(gè)程序段是臨界區(qū)即可,采用可,采用Java抽象的鎖模型抽象的鎖模型。Java的線程互斥實(shí)現(xiàn)的線程互斥實(shí)現(xiàn)nJav

32、a提供關(guān)鍵字提供關(guān)鍵字synchronized聲明一段程聲明一段程序?yàn)榕R界區(qū),使線程互斥訪問臨界資源。序?yàn)榕R界區(qū),使線程互斥訪問臨界資源。nSynchronized提供兩種使用方法:同步語句和提供兩種使用方法:同步語句和同步方法同步方法1.同步語句同步語句synchronized (對(duì)象對(duì)象) 語句語句其中,其中,“對(duì)象對(duì)象”是多線程共享變量,為臨界資源,互斥訪是多線程共享變量,為臨界資源,互斥訪問;問;“語句語句”是臨界區(qū),線程對(duì)臨界資源的操作,如是臨界區(qū),線程對(duì)臨界資源的操作,如果是多條語句,要用果是多條語句,要用括起來。括起來。Java的線程互斥實(shí)現(xiàn)的線程互斥實(shí)現(xiàn)2. 同步方法同步方法s

33、ynchronized 方法方法()方法體方法體方法體為臨界資源,訪問該方法的對(duì)象互斥訪問方法體為臨界資源,訪問該方法的對(duì)象互斥訪問該方法,任一時(shí)刻只有一個(gè)對(duì)象可訪問該方該方法,任一時(shí)刻只有一個(gè)對(duì)象可訪問該方同步語句與同步方法行為相似,前者作用范圍同步語句與同步方法行為相似,前者作用范圍小,只鎖定獲得鎖的對(duì)象(非調(diào)用方法的對(duì)象)小,只鎖定獲得鎖的對(duì)象(非調(diào)用方法的對(duì)象)和相應(yīng)語句和相應(yīng)語句縮小對(duì)象鎖作用域,增加靈活性縮小對(duì)象鎖作用域,增加靈活性互斥的存互斥的存/取款線程設(shè)計(jì)取款線程設(shè)計(jì)(SaveLock.java)帶互斥鎖的并發(fā)線程執(zhí)行流程帶互斥鎖的并發(fā)線程執(zhí)行流程 賬戶鎖定?存款線程取款線程加鎖解鎖對(duì)賬戶操作等待是否互斥的存互斥的存/取款線程設(shè)計(jì)例程說明取款線程設(shè)計(jì)例程說明通過加鎖方式實(shí)現(xiàn)對(duì)象的互斥訪問通過加鎖方式實(shí)現(xiàn)對(duì)象的互斥訪問即使線程執(zhí)行被打斷,也不釋放對(duì)象的鎖,即使線程執(zhí)行被打斷,也不釋放對(duì)象的鎖,直到線程執(zhí)行完才釋放對(duì)象的鎖直到線程執(zhí)行完才釋放對(duì)象的鎖通過互斥訪問,保證數(shù)據(jù)的完整性和一致通過互斥訪問,保證數(shù)據(jù)的完整性和一致性。性。線程間的協(xié)作關(guān)系與線程

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論