計(jì)算機(jī)軟件及應(yīng)用第11講 Java的多線程機(jī)制_第1頁
計(jì)算機(jī)軟件及應(yīng)用第11講 Java的多線程機(jī)制_第2頁
計(jì)算機(jī)軟件及應(yīng)用第11講 Java的多線程機(jī)制_第3頁
計(jì)算機(jī)軟件及應(yīng)用第11講 Java的多線程機(jī)制_第4頁
計(jì)算機(jī)軟件及應(yīng)用第11講 Java的多線程機(jī)制_第5頁
已閱讀5頁,還剩47頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

JAVA

語言第11講JAVA的多線程機(jī)制*第11講JAVA語言12/15/2019序上一講回顧設(shè)計(jì)JAVA

GUI程序的主要流程。JAVAJAVAGUI的事件處理機(jī)制。

GUI常用組件的用法常用屬性、方法、事件第11講序示例11-1未使用多線程技術(shù)的記數(shù)程序。程序功能要求:當(dāng)用戶單擊“Start”按鈕時(shí),開始計(jì)數(shù),計(jì)數(shù)過程中單擊“Close”按鈕時(shí),停止計(jì)數(shù)并關(guān)閉應(yīng)用程序。程序代碼見Counter.javaJAVA語言12/15/2019第11講JAVA語言12/15/2019學(xué)習(xí)要點(diǎn)掌握多線程的概念掌握創(chuàng)建線程的方法了解線程同步、死鎖的概念掌握多線程在實(shí)際編程中的應(yīng)用方法第11講JAVA語言12/15/201911.1線程與多線程概述什么是進(jìn)程?進(jìn)程是程序在其數(shù)據(jù)集合上的運(yùn)行過程,是資源分配和調(diào)度的獨(dú)立單位。什么是線程?線程又稱輕型進(jìn)程,是程序運(yùn)行的最小單位。 在具有線程的操作系統(tǒng)中,進(jìn)程是分配資源的最小單位,線程是調(diào)度基本單位。第11講進(jìn)程與多線程單線程多線程進(jìn)程傳統(tǒng)進(jìn)程JAVA語言12/15/2019多線程進(jìn)程第11講示例示例11-2

使用線程技術(shù)的記數(shù)程序。程序代碼見CounterThread

.java

。上述示例間的區(qū)別?JAVA語言12/15/2019第11講線程的調(diào)度調(diào)度策略1時(shí)間片2JAVA語言12/15/2019搶占式:高優(yōu)先級的線程搶占CPUJava的調(diào)度方法同優(yōu)先級線程組成先進(jìn)先出隊(duì)列,使用時(shí)間片策略對高優(yōu)先級,使用優(yōu)先調(diào)度的搶占式策略第11講JAVA語言12/15/201911.1.2線程的模型 當(dāng)Java程序啟動時(shí),一個線程立刻運(yùn)行,該線程通常叫做程序的主線程(mainthread)。每個Java程序都有一個隱含的主線程。主線程的重要性它是產(chǎn)生其他子線程的線程。 通常它必須最后完成執(zhí)行,因?yàn)樗鼒?zhí)行各種關(guān)閉動作。在本程序中,調(diào)用currentThread()獲得當(dāng)前線程引用;setName()改變線程的內(nèi)部名稱;sleep()暫停線程運(yùn)行;第11講JAVA語言12/15/2019 盡管主線程在程序啟動時(shí)自動創(chuàng)建,但它可以由一個Thread對象控制。 示例11-3ChangeMainThread.java第11講線程的概念模型線程的三個組成部分線程代碼 被操作數(shù)據(jù)線程控制(虛擬CPU)JAVA語言12/15/2019第11講JAVA語言12/15/201911.1.2線程的狀態(tài) 每個線程都是通過某個特定Thread對象的方法run()來完成其操作的,方法run()稱為線程體。 java線程的狀態(tài):創(chuàng)建狀態(tài)、可運(yùn)行狀態(tài)、不可運(yùn)行狀態(tài)、死亡狀態(tài)。第11講線程的狀態(tài)及其轉(zhuǎn)換NewRunnableNot

RunnableDead1.創(chuàng)建狀態(tài)(newThread)執(zhí)行下列語句時(shí),線程就處于創(chuàng)建狀態(tài):ThreadmyThread=newMyThreadClass();new

ThreadJAVA語言12/15/2019第11講線程的狀態(tài)及其轉(zhuǎn)換NewNot

RunnableDead2.可運(yùn)行狀態(tài)(Runnable)ThreadmyThread=newMyThreadClass();myThread.start();new

ThreadstartRunnableJAVA語言12/15/2019第11講線程的狀態(tài)及其轉(zhuǎn)換NewRunnableDead3.不可運(yùn)行狀態(tài)(NotRunnable,也稱阻塞狀態(tài)Blocked)進(jìn)入不可運(yùn)行狀態(tài)的原因有:調(diào)用sleep()、suspend()、wait()、輸入輸出流中發(fā)生線程阻塞。new

Threadstartsleep、wait、suspend、I/O阻塞Not

Runnablesleep結(jié)束、notify、resume、I/O操作完成JAVA語言12/15/2019第11講線程的狀態(tài)及其轉(zhuǎn)換NewNot

RunnableDeadnew

ThreadstartRunnablesleep、wait、suspend、I/O阻塞sleep結(jié)束、notify、resume、I/O操作完成run方法退出stop方法調(diào)用stop方法調(diào)用yield4.死亡狀態(tài)(Dead)JAVA語言12/15/2019(1)線程的終止一般可通過兩種方法實(shí)現(xiàn):自然撤消(線程執(zhí)行完)或是被停止(調(diào)用stop()方法,已被取消。)(2)isAlive方法:1)當(dāng)該線程為可運(yùn)行或被阻塞的線程時(shí),返回true;2)否則,返回false。一個應(yīng)用程序的所有非守護(hù)線程終止時(shí),即使仍然有守護(hù)線程運(yùn)行,應(yīng)用程序也將終止;反之,只要有一個非守護(hù)線程運(yùn)行,則應(yīng)用程序不會終止第11講JAVA語言12/15/201911.1.3

守護(hù)線程 守護(hù)線程(Daemon)具有最低的優(yōu)線級,用于為系統(tǒng)中的其他對象和線程提供服務(wù)。如UNIX中的服務(wù)器程序。相關(guān)操作方法: setDaemon()-置線程為守護(hù)線程,在線程創(chuàng)建前調(diào)用 isDaemon()-判斷一個線程是否為守護(hù)線程。示例11-4 DaemonTest.java使另一個線程獲得運(yùn)行的三種方法:讓處于運(yùn)行狀態(tài)的線程調(diào)用Thread.sleep()方法。讓處于運(yùn)行狀態(tài)的線程調(diào)用Thread.yield()方法。讓處于運(yùn)行狀態(tài)的線程調(diào)用另一個線程的join()方法。第11講JAVA語言12/15/201911.2創(chuàng)建線程Thread類是java.lang包中的一個專門用來創(chuàng)建線程和對線程進(jìn)行操作的類。實(shí)現(xiàn)多線程的兩種編程方法繼承Thread類實(shí)現(xiàn)Runnable接口第11講JAVA語言12/15/201911.2.1多線程的實(shí)現(xiàn)方法方法1.聲明一個Thread類的子類,并覆蓋run()方法。classmythreadextendsThread{publicvoidrun(){/*覆蓋該方法*/}}第11講生成與運(yùn)行線程–方法1nclass

MyThread

extends

Thread{

n

public

void

run(){線程體…}

n}nMyThread

mt

=

new

MyThread();nmt.start();執(zhí)行run()方法JAVA語言12/15/2019第11講線程代碼被操作數(shù)據(jù)Thread類的子類的實(shí)例(mt)建立線程Thread類的子類提供的

run方法線程控制(虛擬CPU)Thread子類實(shí)例(mt)JAVA語言12/15/2019第11講–Easy?

Let’s

try

it!擴(kuò)展Thread類創(chuàng)建線程示例11-5:Consumer.javaJAVA語言12/15/2019第11講JAVA語言12/15/2019Thread類主要方法總結(jié)啟動線程:start()有關(guān)線程執(zhí)行的控制:stop()、suspend()、resume()有關(guān)調(diào)度控制 Thread.sleep(10);//低優(yōu)先級的線程也可以獲得執(zhí)行 Thread.yield();//同優(yōu)先級的線程可以獲得執(zhí)行suspend();//暫停本線程第11講JAVA語言12/15/2019–生成與運(yùn)行線程–方法2方法2.聲明一個實(shí)現(xiàn)Runnable接口的類,并實(shí)現(xiàn)run()方法。classmythreadimplementsRunnable{publicvoidrun(){/*實(shí)現(xiàn)該方法*/}}適合于:定義run()方法的類必須是其他類或其他類的子類。第11講生成與運(yùn)行線程–方法2JAVA語言12/15/2019class

MyRun

implements

Runnable{

public

void

run(){線程體…}}MyRun

mr

=

new

MyRun();Thread

t1

=

new

Thread(mr)

;t1.start();

//Thread實(shí)例用于線程控制voidstart():啟動線程,由Newborn到RunnableStringgetName():返回線程的名稱run():線程在被調(diào)度時(shí)執(zhí)行的操作staticvoidsleep(指定時(shí)間毫秒):令當(dāng)前活動線程在指定時(shí)間段內(nèi)放棄對CPU控制,使其他線程有機(jī)會被執(zhí)行,時(shí)間到后重排隊(duì)產(chǎn)生例外InterruptedException用try塊調(diào)用sleep(),用catch塊處理例外suspend():掛起線程,處于阻塞狀態(tài)resume():恢復(fù)掛起的線程,重新進(jìn)入就緒隊(duì)列排隊(duì)?wèi)?yīng)用:可控制某線程的暫停與繼續(xù)方法:設(shè)一狀態(tài)變量suspendStatus=false(初始)暫停:if(!suspendStatus){T.suspend();suspendStatus=true;}繼續(xù):if(suspendStatus){T.resume();suspendStatus=false;}staticvoidyield():對正在執(zhí)行的線程若就緒隊(duì)列中有與當(dāng)前線程同優(yōu)先級的排隊(duì)線程,則當(dāng)前線程讓出CPU控制權(quán),移到隊(duì)尾若隊(duì)列中沒有同優(yōu)先級的線程,忽略此方法stop():強(qiáng)制線程生命期結(jié)束booleanisAlive():返回boolean,表明是否線程還存在staticcurrentThread():返回當(dāng)前線程第11講–Easy?

Let’s

try

it!實(shí)現(xiàn)Runnable接口創(chuàng)建線程示例11-6:MyThread.javaJAVA語言12/15/2019第11講構(gòu)造線程體的兩種方法的比較:1.使用Runnable接口的模型;還可以從其他類繼承;保持程序風(fēng)格的一致性。直接繼承Thread類不能再從其他類繼承;編寫簡單,可以直接操縱線程,無需使用Thread.currentThread()。應(yīng)該用哪一1)可以將CPU,代碼和數(shù)據(jù)分種開方,法形創(chuàng)形建成清晰線程?JAVA語言12/15/2019第11講JAVA語言12/15/2019

使另一個線程獲得運(yùn)行的三種方法,讓處于運(yùn)行狀態(tài)的線程調(diào)用:Thread.sleep()方法。Thread.yield()方法。另一個線程的join()方法。第11講–11.2.3

創(chuàng)建多線程 示例11-7:CounterMultiThread.javaJAVA語言12/15/2019第11講JAVA語言12/15/201911.3

多線程程序設(shè)計(jì)引入多線程的優(yōu)點(diǎn)與缺點(diǎn)。 當(dāng)多個線程共享一些數(shù)據(jù),引起共享資源的競爭,會導(dǎo)致一些意想不到的錯誤。需要解決的問題:線程的同步(線程之間的配合),互斥(一線程等待另一線程的運(yùn)行),優(yōu)先級的設(shè)置,以及多線程引起的死鎖等。第11講JAVA語言12/15/201911.3.1

多線程同時(shí)運(yùn)行 多線程同時(shí)運(yùn)行,即多個線程間沒有相互制約關(guān)系。示例11-8 MultiCounterThread.java 不同環(huán)境下程序的運(yùn)行結(jié)果可能不同!第11講JAVA語言12/15/201911.3.2

多線程優(yōu)先級調(diào)度·Java中的線程優(yōu)先級是在Thread類中定義的常量NORM_PRIORITY:值為5MAX_PRIORITY:值為10MIN_PRIORITY:值為1·缺省優(yōu)先級為NORM_PRIORITY第11講JAVA語言12/15/2019·有關(guān)優(yōu)先級的方法有兩個:·final

void

setPriority(int

newp):修改線程的當(dāng)前優(yōu)先級·finalint

getPriority():返回線程的優(yōu)先級·示例11-9PriorityDemo.java第11講JAVA語言12/15/201911.3.3

多線程的互斥和同步·

有時(shí)兩個或多個線程可能會試圖同時(shí)訪問一個資源例如,一個線程可能嘗試從一個文件中讀取數(shù)據(jù),而另一個線程則嘗試在同一文件中修改數(shù)據(jù)·在此情況下,這兩個線程所處理的數(shù)據(jù)會一致嗎?怎樣確保數(shù)據(jù)的一致性?第11講JAVA語言12/15/2019·兩種方式實(shí)現(xiàn)互斥:1、使用互斥方法synchronizedvoidmethodA(){ }2.使用互斥塊synchronized(object){//要互斥的語句}第11講JAVA語言12/15/2019 實(shí)現(xiàn)synchronized方法中被調(diào)用的線程間通信的方法: wait()--使被調(diào)用的線程進(jìn)入等待狀態(tài),直到其他線程調(diào)用notify()方法。 notify()--通知同一對象上第1個調(diào)用wait(的線程。 notifyAll()--通知調(diào)用wait()的所有線程具有最高優(yōu)先級的線程將先運(yùn)行。 wait()+notify()+標(biāo)志變量:可協(xié)調(diào)、同步不同線程的工作第11講線程的同步與互斥線程間需協(xié)調(diào)與通訊:生產(chǎn)者/消費(fèi)者問題進(jìn)隊(duì) 出隊(duì)消費(fèi)者JAVA語言12/15/2019生產(chǎn)者示例11-10:生產(chǎn)者-消費(fèi)費(fèi)者問題ProducerConsumerProblem.java第11講JAVA語言12/15/201911.3.4

死鎖 當(dāng)一個線程等待由另一個線程持有的鎖,而后者正在等待已被第一個線程持有的鎖時(shí),就會發(fā)生死鎖。 Java不監(jiān)測也不試圖避免這種情況。因而保證不發(fā)生死鎖就成了程序員的責(zé)任。示例11-11:DaemonTest.java第11講JAVA語言12/15/2019class

Operator

implements

Runnable{Operator

anotherOperator;synchronized

public

void

methodA(){System.out.println(Thread.currentThread().getName()+":beginmethodA");try{Thread.sleep(200);}catch(Exception

e){}System.out.println(Thread.currentThread().getName()+":callanother

methodA");anotherOperator.methodA();System.out.println(Thread.currentThread().getName()+":endmethodA");}public

void

run(){methodA();}}第11講死鎖public

class

DeadLockTest

{public

static

void

main(Stringargs[]){Operator

o1=new

Operator();Operator

o2=new

Operator();o1.anotherOperator=o2;o2.anotherOperator=o1;Thread

t1=new

Thread(o1);Thread

t2=new

Thread(o2);t1.start();t2.start();}}Operator1methodA()t1Operator2methodA()t2JAVA語言12/15/2019第11講JAVA語言12/15/201911.4

多線程的控制 線程sleep()的時(shí)候并不釋放對象的鎖,但是wait()的時(shí)候卻會釋放對象的鎖。 即在線程wait()期間,別的線程可以調(diào)用它的synchronized方法。 當(dāng)線程調(diào)用了某個對象wait()方法之后,它就中止運(yùn)行并釋放那個對象鎖了。第11講JAVA語言12/15/201911.4.1

判斷線程是否結(jié)束 方法一:在線程中調(diào)用isAlive(),格式:finalbooleanisAlive() 如果所調(diào)用線程仍在運(yùn)行,isAlive()方法返回true,否則返回false。第11講JAVA語言12/15/2019 方法二:在線程中調(diào)用join()--更常用的方法是,格式: finalvoidjoin()throwsInterruptedException該方法等待所調(diào)用線程結(jié)束。示例11-12JionDemo.java第11講JAVA語言12/15/201911.4.2

線程阻塞sleep()方法suspend()和resume()方法yield()方法wait()和notify()方法第11講JAVA語言12/15/201911.4.3

線程阻塞的處理

suspend()、resume()和stop()方法示例11

溫馨提示

  • 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

提交評論