java多線程教學(xué)講解課件_第1頁
java多線程教學(xué)講解課件_第2頁
java多線程教學(xué)講解課件_第3頁
java多線程教學(xué)講解課件_第4頁
java多線程教學(xué)講解課件_第5頁
已閱讀5頁,還剩30頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

多線程機(jī)制1.1Java多線程機(jī)制(概念掌握,理解性內(nèi)容)1.2多線程的實(shí)現(xiàn)方法(重點(diǎn)及難點(diǎn))1.3多線程狀態(tài)及調(diào)度(重點(diǎn))1.4線程同步1.5線程通信多線程機(jī)制1.1Java多線程機(jī)制(概11.1Java多線程機(jī)制1.1.1線程的基本概念線程的概念:線程就是應(yīng)用程序中的一個(gè)可執(zhí)行線索,多線程就是同一個(gè)應(yīng)用程序中有多個(gè)可執(zhí)行線索,它們可以并發(fā)執(zhí)行。

為什么要有多線程?線程與進(jìn)程的區(qū)別:可否獨(dú)立運(yùn)行?內(nèi)存空間?1.1Java多線程機(jī)制1.1.1線程的基本概念2多線程機(jī)制一個(gè)建立線程的例子:publicclassSimpleRunnableimplementsRunable{ privateStringmessage; publicstaticvoidmain(Stringargs[]){ SimpleRunnabler1=newSimpleRunnable("Hello"); Threadt1=newThread(r1); t1.start(); } publicSimpleRunnable(Stringmessage){ this.message=message; } publicvoidrun(){ for(;;){ System.out.println(message); }}線程開始執(zhí)行時(shí),它在publicvoidrun()方法中執(zhí)行。該方法是定義的線程執(zhí)行起點(diǎn),像應(yīng)用程序從main()開始一樣。首先main()方法構(gòu)造SimpleRunnable類的實(shí)例。實(shí)例有自己的一個(gè)String數(shù)據(jù),初始化為"Hello"。由實(shí)例傳入Thread類構(gòu)造器,這是線程運(yùn)行時(shí)處理的數(shù)據(jù)。執(zhí)行的代碼是實(shí)例方法run()。多線程機(jī)制一個(gè)建立線程的例子:publicclassSi31.2多線程的實(shí)現(xiàn)方法重點(diǎn)與要點(diǎn):兩種實(shí)現(xiàn)方法創(chuàng)建Thread子類生成一個(gè)類,聲明實(shí)現(xiàn)Runnable接口1.2多線程的實(shí)現(xiàn)方法重點(diǎn)與要點(diǎn):4創(chuàng)建Thread類的子類用這種方法生成新線程,可以按以下步驟進(jìn)行:生成Thread類的子類。classMyThreadextendsThread在子類中重寫run()方法。publicvoidrun()生成子類的對象,并且調(diào)用start()方法啟動(dòng)新線程。MyThreadthread=newMyThread();thread.start();start()方法將調(diào)用run()方法執(zhí)行線程。創(chuàng)建Thread類的子類用這種方法生成新線程,可以按以下步驟5實(shí)現(xiàn)Thread子類方法的多線程示例classFirstThreadextendsThread{publicvoidrun(){try{System.out.println("Firstthreadstartsrunning."); for(inti=0;i<6;i++){ System.out.println("First"+i);sleep(1000);}System.out.println("Firstthreadfinishesrunning.");}catch(InterruptedExceptione){}}}實(shí)現(xiàn)Thread子類方法的多線程示例classFirstT6實(shí)現(xiàn)Thread子類方法的多線程示例classSecondThreadextendsThread{publicvoidrun(){try{System.out.println("\tSecondthreadstartsrunning."); for(inti=0;i<6;i++){ System.out.println("\tSecond"+i); sleep(1000);}System.out.println("\tSecondthreadfinishesrunning");}catch(InterruptedExceptione){}}}實(shí)現(xiàn)Thread子類方法的多線程示例classSecond7實(shí)現(xiàn)Thread子類方法的多線程示例publicclassThreadTest1{publicThreadTest1(){ FirstThreadfirst=newFirstThread(); SecondThreadsecond=newSecondThread(); first.start();second.start(); } publicstaticvoidmain(String[]args){ newThreadTest1(); }}結(jié)果為: Firstthreadstartsrunning. First0 Secondthreadstartsrunning. Second0 First1 Second1 First2 Second2 First3 Second3 First4 Second4 First5 Second5 Firstthreadfinishesrunning.Secondthreadfinished.實(shí)現(xiàn)Thread子類方法的多線程示例publicclass8Thread子類線程小結(jié)(加深理解)需要深入理解線程的run()以及start()方法:start()方法將調(diào)用run()方法執(zhí)行線程。run()方法就是新線程完成具體工作的地方。注意通過對比加深了解:

程序的入口,main()方法。線程的入口,run()方法。Applet的入口,init()方法。Thread子類線程小結(jié)(加深理解)需要深入理解線程的run9創(chuàng)建線程的方式run方法是運(yùn)行線程的主體,啟動(dòng)線程時(shí),由java直接調(diào)用publicvoidrun()停止線程,由小應(yīng)用程序的stop調(diào)用線程的stopthread.stop()sleep方法的作用,暫停線程的執(zhí)行,讓其它線程得到機(jī)會(huì),sleep要丟出異常,必須捕獲。Try{sleep(100)}catch(InterruptedExceptione){}

創(chuàng)建線程的方式run方法是運(yùn)行線程的主體,啟動(dòng)線程時(shí),由ja101.2多線程實(shí)現(xiàn)方法2.實(shí)現(xiàn)Runnable接口什么是Runnable接口?

Runnable是java.lang包中的一個(gè)接口。定義了創(chuàng)建和執(zhí)行線程的功能。定義了run()方法,完成具體任務(wù)的地方。1.2多線程實(shí)現(xiàn)方法2.實(shí)現(xiàn)Runnable接口11實(shí)現(xiàn)Runnable接口實(shí)現(xiàn)Runnable接口的主要步驟:定義一個(gè)類實(shí)現(xiàn)Runnable接口,

classFirstThreadimplementsRunnable并且在該類中實(shí)現(xiàn)run()方法。 publicvoidrun()生成這個(gè)類的對象。

FirstThreadfirst=newFirstThread();用Thread(Runnabletarget)構(gòu)造函數(shù)生成Thread對象,然后調(diào)用start()方法啟動(dòng)線程。

Threadthread1=newThread(first); thread1.start();實(shí)現(xiàn)Runnable接口實(shí)現(xiàn)Runnable接口的主要步驟:12實(shí)現(xiàn)Runnable接口多線程示例classFirstThreadimplementsRunnable{publicvoidrun(){try{System.out.println("Firstthreadstartsrunning.");for(inti=0;i<6;i++){System.out.println("First"+i);Thread.sleep(1000);}System.out.println("Firstthreadfinishesrunning.");}catch(InterruptedExceptione){}}}classSecondThreadimplementsRunnable{publicvoidrun(){try{System.out.println("\tSecondthreadstartsrunning.");for(inti=0;i<6;i++){System.out.println("\tSecond"+i);Thread.sleep(1000);}System.out.println("\tSecondthreadfinished.");}catch(InterruptedExceptione){}}}實(shí)現(xiàn)Runnable接口多線程示例classFirstTh13實(shí)現(xiàn)Runnable接口多線程示例publicclassRunTest{publicRunTest(){ FirstThreadfirst=newFirstThread(); SecondThreadsecond=newSecondThread();Threadthread1=newThread(first);Threadthread2=newThread(second);thread1.start();thread2.start();}publicstaticvoidmain(String[]args){newRunTest();}}結(jié)果為: Firstthreadstartsrunning. First0 Secondthreadstartsrunning. Second0 First1 Second1 First2 Second2 First3 Second3 First4 Second4 First5 Second5 Firstthreadfinishesrunning.Secondthreadfinished.實(shí)現(xiàn)Runnable接口多線程示例publicclass14兩種多線程實(shí)現(xiàn)方法

之對比相同點(diǎn):都可以實(shí)現(xiàn)多線程不同點(diǎn):靈活性:Runnable接口較靈活。應(yīng)用范圍:Runnable>Thread類的子類。兩種多線程實(shí)現(xiàn)方法之對比相同點(diǎn):151.3多線程狀態(tài)及調(diào)度

1.線程的狀態(tài)

具有四種狀態(tài):新生態(tài):已分配內(nèi)在,未高度

可執(zhí)行態(tài):start()

阻塞態(tài)

停止態(tài):stop()

1.3多線程狀態(tài)及調(diào)度1.線程的狀態(tài)16線程狀態(tài)四種狀態(tài)的相關(guān)概念生命周期如下:1.新建:當(dāng)一個(gè)Thread類或其子類的對象被創(chuàng)建后,進(jìn)入這個(gè)狀態(tài)。這時(shí),線程對象已被分配內(nèi)存空間,其私有數(shù)據(jù)已被初始化,但該線程還未被調(diào)度,可用start()方法調(diào)度,或用stop()方法中止。新生線程一旦被調(diào)度,就將切換到可執(zhí)行狀態(tài)。線程狀態(tài)四種狀態(tài)的相關(guān)概念生命周期如下:17線程狀態(tài)2.可運(yùn)行: 處于可執(zhí)行環(huán)境中,隨時(shí)可以被調(diào)度而執(zhí)行。它可細(xì)分為兩個(gè)子狀態(tài):運(yùn)行狀態(tài),已獲得CPU,正在執(zhí)行;就緒狀態(tài),只等待處理器資源。

這兩個(gè)子狀態(tài)的過渡由執(zhí)行調(diào)度器來控制。3.阻塞: 由某種原因引起線程暫停執(zhí)行的狀態(tài)。線程狀態(tài)2.可運(yùn)行:18線程狀態(tài)4.死亡:線程執(zhí)行完畢或另一線程調(diào)用stop()方法使其停止時(shí),進(jìn)入這種停止?fàn)顟B(tài)。它表示線程已退出可運(yùn)行狀態(tài),并且不再進(jìn)入可運(yùn)行狀態(tài)。線程狀態(tài)4.死亡:191.3.2線程優(yōu)先級及調(diào)度

問題:線程為什么需要調(diào)度?為什么引入優(yōu)先級?

應(yīng)用程序中的多個(gè)線程能夠并發(fā)執(zhí)行,但從系統(tǒng)的內(nèi)部來看,所有線程仍然是串行的一個(gè)一個(gè)地執(zhí)行,那么如何來決定哪一個(gè)線程先執(zhí)行,哪一個(gè)線程后執(zhí)行呢?Java引入了優(yōu)先級的概念,優(yōu)先級就是線程獲得CPU而執(zhí)行的優(yōu)先程度,優(yōu)先級越高,獲得CPU的權(quán)力越大,執(zhí)行的機(jī)會(huì)越多,執(zhí)行的時(shí)間也越長。1.3.2線程優(yōu)先級及調(diào)度問題:線程為什么需要調(diào)度?為什20線程優(yōu)先級Java把優(yōu)先級劃分為10級,用1至10的整數(shù)表示,數(shù)值越大,優(yōu)先級越高。在Thread類中定義了三個(gè)優(yōu)先級常量:MIN_PRIORITY,MAX_PRIORITY和NORM_PRIORITY,其值分別為1,10,5。在為線程分配優(yōu)先級時(shí),其值應(yīng)該在1至10之間,否則將出錯(cuò)。如果應(yīng)用程序沒有為線程分配優(yōu)先級,則Java系統(tǒng)為其賦值為NORM_PRIORITY。線程優(yōu)先級Java把優(yōu)先級劃分為10級,用1至10的整數(shù)表示21線程調(diào)度原則調(diào)度就是分配CPU資源,確定線程的執(zhí)行順序。Java采用搶占式調(diào)度方式,即高優(yōu)先級線程具有剝奪低優(yōu)先級線程執(zhí)行的權(quán)力。如果一個(gè)低優(yōu)先線程正在執(zhí)行,這時(shí)出現(xiàn)一個(gè)高優(yōu)先級線程,那么低優(yōu)先級線程就只能停止執(zhí)行,放棄CPU,推回到等待隊(duì)列中,等待下一輪執(zhí)行,而讓高優(yōu)先級線程立即執(zhí)行。如果線程具有相同的優(yōu)先級,則按"先來先服務(wù)"的原則調(diào)度。線程調(diào)度原則調(diào)度就是分配CPU資源,確定線程的執(zhí)行順序。22線程調(diào)度原則問題:如果高優(yōu)先級搶占了低優(yōu)先級的線程后,一直占據(jù)CPU,低優(yōu)先級的線程如何獲得控制權(quán)?有兩個(gè)方法可以改變這種現(xiàn)象:一是調(diào)用sleep()方法,暫時(shí)進(jìn)入睡眠狀態(tài),從而讓出CPU,使有相同優(yōu)先級線程和低優(yōu)先級線程有執(zhí)行的機(jī)會(huì)。二是調(diào)用yield()而放棄CPU,這時(shí)和它有相同優(yōu)先級的線程就有執(zhí)行的機(jī)會(huì)。線程調(diào)度原則問題:如果高優(yōu)先級搶占了低優(yōu)先級的線程后,一直占231.3.3線程的控制必須了解Java程序的線程結(jié)構(gòu):每個(gè)Java程序都有一個(gè)缺省的主線程:Application,主線程是main方法執(zhí)行的線索;Applet,主線程指揮瀏覽器加載并執(zhí)行Java小程序。要想實(shí)現(xiàn)多線程,必須在主線程中創(chuàng)建新的線程對象。1.3.3線程的控制必須了解Java程序的線程結(jié)構(gòu):24線程的狀態(tài)轉(zhuǎn)換圖阻塞死亡可運(yùn)行suspend()sleep()wait()I/Oblockingresume()sleeptime_outnotify()I/Ofinished新建new語句start()Stop()Stop()Stop()線程的狀態(tài)轉(zhuǎn)換圖阻塞死亡可運(yùn)行suspend()resume25線程控制方法Thread類定義了許多控制線程執(zhí)行的方法。▼程序中經(jīng)常使用下面的方法,對線程進(jìn)行控制:start():用于調(diào)用run()方法使線程開始執(zhí)行。stop():立即停止線程執(zhí)行,其內(nèi)部狀態(tài)清零,放棄占用資源。suspend():暫停線程執(zhí)行。線程的所有狀態(tài)和資源保持不變,以后可以通過另一線程調(diào)用resume()方法來重新啟動(dòng)這個(gè)線程。線程控制方法Thread類定義了許多控制線程執(zhí)行的方法。▼26線程控制方法resume():恢復(fù)暫停的線程,安排暫停線程執(zhí)行。sleep():調(diào)整Java執(zhí)行時(shí)間,所需參數(shù)是指定線程的睡眠時(shí)間,以毫秒為單位。join():調(diào)用線程等待本線程執(zhí)行結(jié)束。yield():暫停調(diào)度線程并將其放在等待隊(duì)列末尾,等待下一輪執(zhí)行,使同優(yōu)先級的其它線程有機(jī)會(huì)執(zhí)行。線程控制方法resume():恢復(fù)暫停的線程,安排暫停線程執(zhí)27線程控制方法isAlive():判斷線程目前是否正在執(zhí)行狀態(tài)中線程處于“新建”狀態(tài)時(shí),線程調(diào)用方法返回false。當(dāng)一個(gè)線程調(diào)用start()方法,并占有CUP資源后,該線程的run方法就開始運(yùn)行,在線程的run方法結(jié)束之前,即沒有進(jìn)入死亡狀態(tài)之前,線程調(diào)用isAlive()方法返回true。當(dāng)線程進(jìn)入“死亡”狀態(tài)后(實(shí)體內(nèi)存被釋放),線程仍可以調(diào)用方法isAlive(),這時(shí)返回的值是false。線程控制方法isAlive():判斷線程目前是否正在執(zhí)行狀態(tài)281.4線程同步為什么需要線程同步?多線程提高了程序的并發(fā)度,但是有時(shí)候是不安全的或者不合邏輯的。則需要多線程同步。線程同步是多線程編程的一個(gè)相當(dāng)重要的技術(shù)。多線程同步控制機(jī)制:保證同一時(shí)刻只有一個(gè)線程訪問數(shù)據(jù)資源。同步鎖:Java用鎖標(biāo)志的手段,對被訪問的數(shù)據(jù)進(jìn)行同步限制,從而實(shí)現(xiàn)對數(shù)據(jù)的保護(hù)。把所有被保護(hù)資源都加上鎖標(biāo)志,線程必須取得鎖標(biāo)志才能訪問被保護(hù)的資源。1.4線程同步為什么需要線程同步?29線程同步在Java中,使用修飾符synchronized來為被保護(hù)資源加鎖。synchronized只能用來說明方法和代碼段,不能用它來說明類和成員變量。用synchronized修飾的方法和代碼段稱為方法同步和代碼段同步,它意味著同一時(shí)刻該方法或代碼段只能被一個(gè)線程執(zhí)行,其它想執(zhí)行該方法或代碼段的線程必須等待。方法同步僅在該方法前加上synchronized修飾符即可。線程同步在Java中,使用修飾符synchronized來為30線程同步同步操作是以犧牲CPU資源為代價(jià)的。正確使用同步可以減少線程間的相互干擾,提高程序的穩(wěn)定性和可靠性。Java程序中多個(gè)線程可以通過消息來實(shí)現(xiàn)互動(dòng)聯(lián)系的,通??梢杂胣otify()或notifyAll()方法喚醒其它一個(gè)或所有線程。使用wait()方法來使該線程處于阻塞狀態(tài),等待其它的線程用notify()喚醒。線程同步同步操作是以犧牲CPU資源為代價(jià)的。31wait方法和notify方法是Java同步機(jī)制中重要的組成部分。結(jié)合與synchronized關(guān)鍵字使用,可以建立很多優(yōu)秀的同步模型。同步分為類級別和對象級別,分別對應(yīng)著類鎖和對象鎖。如果static的方法被synchronized關(guān)鍵字修飾,則在這個(gè)方法被執(zhí)行前必須獲得類鎖。對象鎖類似。wait方法和notify方法是Java同步機(jī)制中重要的組成32wait和notify的應(yīng)用示例importjava.lang.Runnable;importjava.lang.Thread;classTestThreadextendsThread{ privateinttime=0; publicTestThread(Runnabler,Stringname){ super(r,name); } publicintgetTime(){returntime;} publicintincreaseTime(){return++time;}}publicclassDemoThreadimplementsRunnable{ publicDemoThread(){ TestThreadtestthread1=newTestThread(this,"1"); TestThreadtestthread2=newTestThread(this,"2"); testthread2.start(); testthread1.start(); } publicstaticvoidmain(String[]args){ newDemoThread(); }wait和notify的應(yīng)用示例impo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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

提交評論