版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第13章多線程多線程是Java中的并發(fā)機制,表示能夠在同一時間內(nèi)同時執(zhí)行多個操作。在日常生活中,邊上網(wǎng)邊聽歌就是一個多線程。隨著CPU進(jìn)入雙核,甚至多核時代,多線程的優(yōu)勢越來越明顯。Java本身就是一門支持多線程的語言,在Java中使用多線程是很方便的,同樣也是很高效的。13.1多線程簡介在前面的學(xué)習(xí)中,雖然沒有使用多線程,但是同樣使用到了線程的知識。在每一個程序中的main方法就是一個線程,它一般被稱為主線程。在主線程中可以啟動多個子線程來執(zhí)行。多線程也就是讓程序具有多個并發(fā)的執(zhí)行線索,類似于團(tuán)隊協(xié)作,多人合作完成一個任務(wù),這樣一來就可以大大提高效率,提高資源的利用率。13.2定義線程和創(chuàng)建線程對象上一節(jié)講解了什么是多線程,本節(jié)將講解怎樣來定義線程和如何創(chuàng)建線程對象。定義線程有兩種方法,一種是繼承Thread類,一種是實現(xiàn)Runnable接口,這兩種方法存在各自優(yōu)缺點。和定義線程對應(yīng)的就是創(chuàng)建線程對象,也有兩種方法。在本節(jié)中就來學(xué)習(xí)使用這兩種方法來定義線程,以及相對應(yīng)的創(chuàng)建線程對象的方法。13.2.1繼承Thread類定義線程定義一個線程可以通過繼承Thread類來實現(xiàn),繼承的類就具有了線程的能力。這是一種相對簡單的定義線程的方法。采用這種方式來實現(xiàn)繼承最重要的一點就是在定義的線程中需要重寫Thread中的潤方法。在重寫的run方法中,可以定義該線程所要執(zhí)行的語句。當(dāng)線程啟動時,run方法中的程序就成為一條獨立的執(zhí)行線程。13.2.2實現(xiàn)Runnable接口定義線程定義線程除了通過繼承Thread類來實現(xiàn),還可以通過實現(xiàn)Runnable接口來實現(xiàn)。在Runnable接口中具有一個抽象的run方法,在實現(xiàn)Runnable接口時,需要實現(xiàn)該run方法。該run方法就會作為一個執(zhí)行線程的方法。對于實現(xiàn)Runnable接口的類,其自身并不是一個線程,只是在該類中通過實現(xiàn)run方法指出了線程所需要完成的任務(wù)。13.3運行線程上一節(jié)學(xué)習(xí)了如何定義線程,并且知道了如何創(chuàng)建線程對象。讀者對這些都了解后,就需要來學(xué)習(xí)如何運行線程。本節(jié)將分兩個部分來講解,先講解如何啟動線程,然后講解如何運行多個線程。13.3.1啟動線程有些讀者會認(rèn)為啟動線程就是調(diào)用線程類中的run方法,但這個觀點是錯誤的,在線程創(chuàng)建完成之后,其并不是一個獨立執(zhí)行的線程,而是一個普通的對象,如果要讓其成為一個獨立的執(zhí)行線程就必須要進(jìn)行啟動。13.3.2同時運行多個線程如果是兩個或者兩個以上的線索同時進(jìn)行,可能前面的例子中就會出現(xiàn)不同的結(jié)果,Java中對于線程的啟動后可以保證的只是每個線程都啟動并且會執(zhí)行結(jié)果,但是這些線程哪些會先執(zhí)行,哪一些會后執(zhí)行呢。接下來就來學(xué)習(xí)如何同時運行多個線程。首先通過示例代碼13-6來看一下如何同時運行多個線程。13.4線程生命周期線程是存在生命周期的。線程的生命周期分為5種不同的狀態(tài),分別是新建狀態(tài)、準(zhǔn)備狀態(tài)、運行狀態(tài)、等待/阻塞狀態(tài)和死亡狀態(tài)。本節(jié)將對每一個狀態(tài)進(jìn)行講解。13.4.1新建狀態(tài)當(dāng)一個線程對象被創(chuàng)建后,線程就處于新建狀態(tài)。在新建狀態(tài)中的線程對象從嚴(yán)格意義上看還只是一個普通的對象,它還不是一個獨立的線程,不會被線程調(diào)度程序調(diào)度。處于新建狀態(tài)中的線程被調(diào)用start方法后就會進(jìn)入準(zhǔn)備狀態(tài)。從新建狀態(tài)中只能進(jìn)入準(zhǔn)備狀態(tài),并且不能從其他狀態(tài)進(jìn)行新建狀態(tài)。新建狀態(tài)是線程生命周期的第一個狀態(tài)。13.4.2準(zhǔn)備狀態(tài)處于新建狀態(tài)中的線程被調(diào)用start方法就會進(jìn)入準(zhǔn)備狀態(tài),等待被調(diào)度執(zhí)行。處于準(zhǔn)備狀態(tài)下的線程隨時都可能被系統(tǒng)選擇進(jìn)入運行狀態(tài),從而執(zhí)行線程??赡芡瑫r有多個線程處于準(zhǔn)備狀態(tài),對于哪一個線程將進(jìn)入運行狀態(tài)是不確定的。線程從新建狀態(tài)進(jìn)入到準(zhǔn)備狀態(tài)后是不可能再進(jìn)入新建狀態(tài)的。在等待/阻塞狀態(tài)中的線程被解除等待和阻塞后將不直接進(jìn)入運行狀態(tài),而是首先進(jìn)入準(zhǔn)備狀態(tài),讓系統(tǒng)來選擇哪一個線程進(jìn)入運行狀態(tài)。13.4.3運行狀態(tài)處于準(zhǔn)備狀態(tài)中的線程一旦被系統(tǒng)選中,使線程獲取了CPU時間,就會進(jìn)入運行狀態(tài)。在運行狀態(tài)中將執(zhí)行線程類run方法中的程序語句。線程進(jìn)入運行狀態(tài)后也不是一下執(zhí)行結(jié)束的,線程在運行狀態(tài)下隨時都可能被調(diào)度程序調(diào)度回準(zhǔn)備狀態(tài)。在運行狀態(tài)下還可以讓線程進(jìn)入到等待/阻塞狀態(tài)。在通常的單核CPU中,在同一時刻只有一個線程處于運行狀態(tài)的。在多核的CPU中,就可能兩個線程或更多的線程同時處于運行狀態(tài),這也是多核CPU運行速度快的原因。13.4.4等待/阻塞狀態(tài)Java中定義了許多線程調(diào)度的方法,包括睡眠、阻塞、掛起和等待,這些方法將在后面的調(diào)度章節(jié)中講解。使用這些方法都會將處于運行狀態(tài)的線程調(diào)度到等待/阻塞狀態(tài)。處于等待/阻塞狀態(tài)的線程被解除后,不會立即回到運行狀態(tài),而是首先進(jìn)入準(zhǔn)備狀態(tài),等待系統(tǒng)的調(diào)度。13.4.5死亡狀態(tài)當(dāng)線程中的run方法執(zhí)行結(jié)束后,或者程序發(fā)生異常終止運行后,線程會進(jìn)入死亡狀態(tài)。處于死亡狀態(tài)的線程不能再使用start方法啟動線程,這在前面的學(xué)習(xí)中已經(jīng)學(xué)到了這一點。但是這不代表處于死亡狀態(tài)的線程不能再被使用,它也是可以再被使用的,只是將被作為普通的類來使用。13.5線程的調(diào)度通過系統(tǒng)自動調(diào)度,線程的執(zhí)行順序是沒有保障的。Java中定義了一些線程調(diào)度的方法,使用這些方法在一定程序上對線程進(jìn)行調(diào)度,使用這些方法只是給線程一個調(diào)度的建議,具體是否能夠成功,也是沒有保障的。線程調(diào)度的方法有幾個,包括睡眠方法、設(shè)置優(yōu)先級、讓步方法等,在本節(jié)中就來學(xué)習(xí)這些方法的使用。13.5.1睡眠方法當(dāng)線程處于運行狀態(tài)時,調(diào)用sleep睡眠方法將使線程從運行狀態(tài)進(jìn)入等待/阻塞狀態(tài),從而使程序停止運行。該方法是使正在運行的線程讓出CPU的最簡單方法之一。sleep睡眠方法是具有一個時間參數(shù)的,當(dāng)經(jīng)過這么長時間后,線程將進(jìn)入準(zhǔn)備狀態(tài),等待系統(tǒng)的調(diào)度。從而可以看出,當(dāng)線程調(diào)用睡眠方法后,要想回到運行狀態(tài),需要的時間要比指定的睡眠時間長。13.5.2線程優(yōu)先級在大部分的系統(tǒng)中,對進(jìn)程的調(diào)度都是采用優(yōu)先級的方式來進(jìn)行的。在Java中對線程進(jìn)行調(diào)度時,也是可以采用優(yōu)先級來調(diào)度的。不同的線程可以具有不同的優(yōu)先級,優(yōu)先級高的線程就會有更大的獲得CPU資源的概率,優(yōu)先級低的線程也并不是總不能被執(zhí)行,而是在優(yōu)先級高的線程執(zhí)行完之后再執(zhí)行。13.5.3yield讓步方法在Java中具有兩種線程讓步方法,先來介紹第一種yield讓步方法。yield讓步方法是可以使當(dāng)前正在運行的線程讓出當(dāng)前CPU,使線程回到準(zhǔn)備狀態(tài),讓其他線程有進(jìn)入運行狀態(tài)的機會,而將CPU讓給哪一個線程是不確定的,由系統(tǒng)來進(jìn)行選擇。使用yield讓步方法的線程將從運行狀態(tài)進(jìn)入到準(zhǔn)備狀態(tài)。13.5.4join讓步方法使用join讓步方法,可以將當(dāng)前線程的CPU資源讓步給指定的線程。當(dāng)一個線程必須要等待另一個線程執(zhí)行完畢才可以恢復(fù)的時候可以使用join讓步方法。13.6綜合練習(xí)1.判斷下面程序是否能夠正常運行?!具\行結(jié)果】使用javac編譯程序?qū)a(chǎn)生一個和該程序?qū)?yīng)的class程序,然后使用Java運行編譯產(chǎn)生的class程序。2.判斷下面的程序是否能夠正常運行?!具\行結(jié)果】使用javac編譯程序?qū)a(chǎn)生一個和該程序?qū)?yīng)的class
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 露天礦輪斗挖掘機司機測試驗證考核試卷含答案
- 2025年棉花生產(chǎn)項目合作計劃書
- 起重機械維修工復(fù)測能力考核試卷含答案
- 餐廚垃圾收集工操作規(guī)程模擬考核試卷含答案
- 園林養(yǎng)護(hù)工安全技能競賽考核試卷含答案
- 學(xué)校單位職工個人請假條
- 2025年P(guān)E電纜專用料項目發(fā)展計劃
- 班主任培訓(xùn)課件
- 犬治療技術(shù)教學(xué)課件
- 2026年智能睡眠呼吸訓(xùn)練器項目公司成立分析報告
- 資源土豬出售合同協(xié)議
- (高清版)DB50∕T 867.30-2022 安全生產(chǎn)技術(shù)規(guī)范 第30部分:有色金屬鑄造企業(yè)
- 九年級化學(xué)上冊 2.4 元素(2)教學(xué)設(shè)計 (新版)魯教版
- (二調(diào))武漢市2025屆高中畢業(yè)生二月調(diào)研考試 生物試卷(含標(biāo)準(zhǔn)答案)
- 2024-2025學(xué)年天津市和平區(qū)高三上學(xué)期1月期末英語試題(解析版)
- (康德一診)重慶市2025屆高三高三第一次聯(lián)合診斷檢測 地理試卷(含答案詳解)
- 真需求-打開商業(yè)世界的萬能鑰匙
- 傷寒論398條條文
- ISO9001-2015質(zhì)量管理體系版標(biāo)準(zhǔn)
- 翻建房屋四鄰協(xié)議書范本
- PRP注射治療膝關(guān)節(jié)炎
評論
0/150
提交評論