版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年撫遠縣幼兒園教師招教考試備考題庫附答案解析
- 2025年南鄭縣幼兒園教師招教考試備考題庫帶答案解析(奪冠)
- 2025年松原職業(yè)技術(shù)學(xué)院單招職業(yè)技能考試模擬測試卷帶答案解析
- 制造業(yè)質(zhì)量安全培訓(xùn)課件
- 口腔知識講坐
- 司法臨床司法鑒定培訓(xùn)
- 制度培訓(xùn)案例欣賞
- 制作的培訓(xùn)心得
- 口罩佩戴知識
- 制作培訓(xùn)課件心得
- dbj41河南省城市地下綜合管廊施工與驗收標(biāo)準(zhǔn)
- 2026屆新高考語文三輪沖刺復(fù)習(xí):二元思辨作文審題構(gòu)思寫作
- 行業(yè)背景分析報告
- 2025中國農(nóng)業(yè)大學(xué)管理服務(wù)崗位(非事業(yè)編)招聘1人筆試備考試題附答案解析
- 2025福建省融資擔(dān)保有限責(zé)任公司招聘4人筆試試題附答案解析
- 2025年青海公務(wù)員《行政職業(yè)能力測驗》試題及答案
- 工程管理費合同協(xié)議
- 學(xué)堂在線 雨課堂 學(xué)堂云 生活英語聽說 期末復(fù)習(xí)題答案
- 低蛋白血癥的護理查房知識ppt
- 2023自愿離婚協(xié)議書范文(3篇)
- 30以內(nèi)加法運算有進位1000題1
評論
0/150
提交評論