課件java理論lesson面向?qū)ο蟪绦蛟O(shè)計_第1頁
課件java理論lesson面向?qū)ο蟪绦蛟O(shè)計_第2頁
課件java理論lesson面向?qū)ο蟪绦蛟O(shè)計_第3頁
課件java理論lesson面向?qū)ο蟪绦蛟O(shè)計_第4頁
課件java理論lesson面向?qū)ο蟪绦蛟O(shè)計_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

付費下載

下載本文檔

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

文檔簡介

1、第12講 多線程面向?qū)ο蟪绦蛟O(shè)計北京科技大學(xué)天津?qū)W院 信息工程系2本章主要內(nèi)容多線程的概念線程的創(chuàng)建設(shè)置線程為后臺線程設(shè)置線程的優(yōu)先級線程的同步:售票問題線程間的通信:生產(chǎn)者與消費者問題線程的終止北京科技大學(xué)天津?qū)W院 信息工程系3多線程概述并行編程通常能夠顯著地提高程序的性能。多進程:在操作系統(tǒng)中能同時運行多個任務(wù)(程序)。多線程:在同一應(yīng)用程序(進程)中有多個順序流同時執(zhí)行。線程與進程的區(qū)別:每個進程都有自己的一組完整的變量,而線程則共享相同的數(shù)據(jù)。一個運行中的Java程序是一個進程且至少包含一個線程,該線程也稱為主線程。北京科技大學(xué)天津?qū)W院 信息工程系4Java中使用多線程有兩種創(chuàng)建線程任

2、務(wù)的方法:實現(xiàn)java.lang.Runnable接口繼承java.lang.Thread類Runnable接口public interface Runnable public void run( );/線程體Thread類public class Thread implements Runnable public void run( ) ; /線程體 public void start( ) ; /啟動線程 北京科技大學(xué)天津?qū)W院 信息工程系5繼承Thread類實現(xiàn)多線程Thread類的構(gòu)造方法:Thread()Thread(Runnable target)Thread(String name

3、)常用實例方法:static Thread currentThread() String getName() int getPriority() Thread.State getState()void interrupt() void run() void setDaemon(boolean on)void start()static void sleep(long millis) static void yield() 北京科技大學(xué)天津?qū)W院 信息工程系6繼承Thread類實現(xiàn)多線程暫停線程: yield() 設(shè)置后臺線程(守護線程): setDaemon(true)當(dāng) Java 虛擬機啟動時

4、,通常都會有單個非守護線程(它通常會調(diào)用某個指定類的 main 方法)。Java 虛擬機會繼續(xù)執(zhí)行線程,直到下列任一情況出現(xiàn)時為止: 調(diào)用了 Runtime 類的 exit 方法,并且安全管理器允許退出操作發(fā)生。 非守護線程的所有線程都已停止運行。北京科技大學(xué)天津?qū)W院 信息工程系7繼承Thread類實現(xiàn)多線程線程的優(yōu)先級每個線程都維護一個優(yōu)先級的屬性,該屬性代表了該線程在程序中的重要程度,Java虛擬機將選擇優(yōu)先級最高的線程進入運行狀態(tài)。Thread類中提供了一些常量來表示某些優(yōu)先級,Thread.MIN_PRIORITY表示最低優(yōu)先級,Thread.MAX_PRIORITY表示最高優(yōu)先級,T

5、hread.NORM_PRIORITY表示普通優(yōu)先級,默認(rèn)情況下,線程的優(yōu)先級是普通優(yōu)先級。除了這三個優(yōu)先級,Java一共支持10個優(yōu)先級 。通過Thread.setPriority( )和Thread.getPriority( )對線程的優(yōu)先級進行修改與讀取 。北京科技大學(xué)天津?qū)W院 信息工程系8實現(xiàn)Runnable接口實現(xiàn)多線程通過實現(xiàn)Runnable接口來實現(xiàn)線程,需要以下幾步:(1)編寫類,聲明要實現(xiàn)Runnable接口:public class SimpleThread implements Runnable(2)實現(xiàn)線程體run( )方法,這里的代碼是核心代碼,run方法結(jié)束意味著線

6、程結(jié)束:public void run( ).(3)利用Thread其它的構(gòu)造方法來構(gòu)造線程對象,此時線程并沒有執(zhí)行:SimpleThread st = new SimpleThread ( );Thread t = new Thread(st); /st即為線程對象(4)調(diào)用線程對象的start( )方法,啟動線程:t.start( );北京科技大學(xué)天津?qū)W院 信息工程系9實現(xiàn)多線程應(yīng)盡量采用實現(xiàn)Runnable接口方式實現(xiàn)多線程,原因主要有:Java單一繼承機制,如果線程類繼承了Thread類,就不能繼承其他類。實現(xiàn)Runnable接口的線程可以共享同一資源,例如:北京科技大學(xué)天津?qū)W院 信息

7、工程系10多線程實例售票系統(tǒng)public void run() throws InterruptedException while(true) if (tickets = 0) return;Thread.sleep(1000); /利用線程休眠模擬賣票的時間System.out.println(Thread.currentThread().getName() + ( + tickets- + );存在問題:當(dāng)賣最后一張票時,多個線程由于時間片輪換有可能均執(zhí)行到輸出語句,因此,出現(xiàn)賣出第0、-1、-2張票的現(xiàn)象。北京科技大學(xué)天津?qū)W院 信息工程系11線程的同步為了解決資源共享問題,使用加鎖機制,

8、即每一時刻只能有一個線程對共享資源進行讀寫,就像上了一把鎖,只有擁有鑰匙的線程才能訪問。當(dāng)線程不再訪問共享資源時,再把鑰匙交出,由其它想訪問該資源的線程競爭訪問權(quán)。這種對共享資源加以控制的方法,稱為同步。Java語言為了解決同步問題,提供了一個關(guān)鍵字synchronized。這個關(guān)鍵字有兩種使用方式:程序塊同步和對方法同步。線程間通信方法說明wait( )告訴當(dāng)前線程放棄同步鎖并進入睡眠狀態(tài)(進入等待隊列),直到其他線程進入同一個同步鎖并調(diào)用notify為止。notify( )將從該同步鎖的等待隊列中刪除一個任意選擇的線程,這個線程將再次成為可運行的線程。notifyAll( )將從該同步鎖的

9、等待隊列中刪除所有等待的線程,這些線程將成為可運行的線程。12線程間的通信機制,Java線程之間通信是通過wait( )、notify( )以及notifyAll( )來實現(xiàn)的。北京科技大學(xué)天津?qū)W院 信息工程系北京科技大學(xué)天津?qū)W院 信息工程系13生產(chǎn)者與消費者問題【例9.6】生產(chǎn)中消費者問題對線程間通信做具體的介紹。系統(tǒng)由生產(chǎn)者線程、消費者線程以及一個共享緩沖區(qū)組成,其中:1. 生產(chǎn)者不斷寫入,直到共享緩沖區(qū)滿為止,一旦共享緩沖區(qū)有空間,生產(chǎn)者繼續(xù)寫入;2. 消費者不斷讀出,直到共享緩沖區(qū)為空,一旦共享緩沖區(qū)有內(nèi)容,消費者繼續(xù)讀出;3. 共享緩沖器內(nèi)部空間為N(本例設(shè)N=1),任一時刻只能有一

10、個線程對緩沖區(qū)操作。北京科技大學(xué)天津?qū)W院 信息工程系14線程的終止正常退出一般在寫線程體run( )方法的時候,提倡使用無限循環(huán)的方式,然后在循環(huán)內(nèi)部通過一個boolean型標(biāo)記控制循環(huán)的停止。外部中斷線程當(dāng)線程使用了sleep( )方法或者因為某些方法如wait( )方法的調(diào)用而進入阻塞狀態(tài),不能自己中斷,此時又需要中斷該線程,這是可以使用Thread類中的interrupt( )方法使線程中斷,但程序會拋出InterruptedException異常。北京科技大學(xué)天津?qū)W院 信息工程系15使用Executors創(chuàng)建線程池Java從1.5版本開始提供Executor。Executor是一個接口

11、,實現(xiàn)此接口的子類作為一個輔助類,能夠執(zhí)行已提交的具有Runnable接口的任務(wù)對象。該接口為線程提供一種將任務(wù)提交與每個任務(wù)將如何運行的機制(包括線程使用的細(xì)節(jié)、調(diào)度等)分離開來的方法。接口ExecutorService繼承了Executor,是一個使用更加廣泛的接口。為了獲得一個ExecutorService類型的實例,需要使用Executors工廠類。北京科技大學(xué)天津?qū)W院 信息工程系16使用Executors創(chuàng)建線程池【例9.7】修改例9.6生產(chǎn)者消費者問題,利用Executors建立一個線程池并啟動多個線程。為了實現(xiàn)本例,首先需要已經(jīng)實現(xiàn)Runnable接口的線程體,例9.6中的Producer和Consumer已經(jīng)符合要求,只需要修改Main,利用Executors來啟動多個線程即可。import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class Main public static void main(String args) /建立線程池 ExecutorService exec = Executors.newCachedThreadPool( ); Queue q = new Queue( )

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論