




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
11Java多線程機制Java程序設計第章Java程序設計教程-第2版-第11章-Java多線程機制全文共30頁,當前為第1頁。C目錄ONTENTS11.2線程的創(chuàng)建11.3線程狀態(tài)及轉(zhuǎn)換11.4線程調(diào)度11.5線程常用方法11.6線程同步與鎖機制11.1線程基本概念11.7線程的交互11.8小結(jié)Java程序設計教程-第2版-第11章-Java多線程機制全文共30頁,當前為第2頁。11.1.1操作系統(tǒng)與進程是管理和控制計算機硬件與軟件資源的程序,是最基本的系統(tǒng)軟件,任何其他軟件都必須在操作系統(tǒng)的支持下才能運行。1.操作系統(tǒng)是指同時使用多種計算資源解決計算問題的過程,是提高計算機系統(tǒng)計算速度和處理能力的一種有效手段。它的基本思想是用多個處理器來協(xié)同求解同一問題,即將被求解的問題分解成若干個部分,各部分均由一個獨立的處理機來并行計算。2.并行計算(ParallelComputing)Java程序設計教程-第2版-第11章-Java多線程機制全文共30頁,當前為第3頁。是指一個時間段中有幾個程序都處于已啟動運行到運行完畢之間的狀態(tài),且這幾個程序都是在同一個處理機上運行,但任一個時刻只有一個程序在處理機上運行。對于多數(shù)微型計算機而言,操作系統(tǒng)支持多任務就是使多進程并發(fā)地執(zhí)行。由于計算速度快,因此用戶對一個CPU執(zhí)行多個進程時不同進程的切換感覺不到。11.1.1操作系統(tǒng)與進程3.并發(fā)(Concurrency)Java程序設計教程-第2版-第11章-Java多線程機制全文共30頁,當前為第4頁。11.1.2進程與線程進程是指內(nèi)存中運行的應用程序,每個進程都有自己獨立的一塊內(nèi)存空間。比如在Windows系統(tǒng)中,一個運行的exe文件就是一個進程。線程是指進程中的一個執(zhí)行流程,一個進程中可以運行多個線程。比如java.exe進程中可以運行很多線程。線程總是屬于某個進程,進程中的多個線程共享進程的內(nèi)存。Java程序設計教程-第2版-第11章-Java多線程機制全文共30頁,當前為第5頁。C目錄ONTENTS11.2線程的創(chuàng)建11.3線程狀態(tài)及轉(zhuǎn)換11.4線程調(diào)度11.5線程常用方法11.6線程同步與鎖機制11.1線程基本概念11.7線程的交互11.8小結(jié)Java程序設計教程-第2版-第11章-Java多線程機制全文共30頁,當前為第6頁。11.2.1擴展Thread類要創(chuàng)建一個線程類,可以直接擴展java.lang.Thread類。此類中有個run()方法:Thread
類的子類應該重寫該方法。run方法又稱線程體,是線程的核心,一個運行的線程實際上是該線程的run()被調(diào)用,所以線程的操作要在run方法中進行定義。publicvoidrun()【例11.1】基于Thread類實現(xiàn)的多線程。Example11_01.javaJava程序設計教程-第2版-第11章-Java多線程機制全文共30頁,當前為第7頁。11.2.2實現(xiàn)Runnable接口由于Java不支持多繼承,在已有一個父類的情況下不能再對Thread擴展。這種情況下可以通過實現(xiàn)接口Runnable來創(chuàng)建線程類。Runnable接口中只聲明了一個方法run(),所以實現(xiàn)該接口的類必須重定義該方法。仍然要使用線程類的對象。Thread類共有8個構造方法,其中一個構造方法:Thread(Runnable
target)由參數(shù)target提供run()方法。【例11.2】實現(xiàn)Runnable接口實現(xiàn)的多線程例子。Example11_2.java
Java程序設計教程-第2版-第11章-Java多線程機制全文共30頁,當前為第8頁。C目錄ONTENTS11.2線程的創(chuàng)建11.3線程狀態(tài)及轉(zhuǎn)換11.4線程調(diào)度11.5線程常用方法11.6線程同步與鎖機制11.1線程基本概念11.7線程的交互11.8小結(jié)Java程序設計教程-第2版-第11章-Java多線程機制全文共30頁,當前為第9頁。11.3線程狀態(tài)及轉(zhuǎn)換線程對象和其他對象一樣有生命期。線程在生命期中有多種不同的狀態(tài),且線程因不同條件會在不同狀態(tài)之間轉(zhuǎn)換。線程在生命期中可能經(jīng)歷五種狀態(tài):新建(New)、就緒或者可運行(ReadyorRunnable)、運行(Running)、阻塞(Blocked)、死亡(Dead)。Java程序設計教程-第2版-第11章-Java多線程機制全文共30頁,當前為第10頁。C目錄ONTENTS11.2線程的創(chuàng)建11.3線程狀態(tài)及轉(zhuǎn)換11.4線程調(diào)度11.5線程常用方法11.6線程同步與鎖機制11.1線程基本概念11.7線程的交互11.8小結(jié)Java程序設計教程-第2版-第11章-Java多線程機制全文共30頁,當前為第11頁。11.4.1線程優(yōu)先級線程從就緒狀態(tài)到運行狀態(tài)的轉(zhuǎn)換,依賴于線程調(diào)度,線程調(diào)度的依據(jù)之一是線程的優(yōu)先級。每一個線程都有優(yōu)先級,在就緒隊列中的優(yōu)先級高的線程先獲得執(zhí)行。Java線程有十個優(yōu)先級,用數(shù)字1~10表示,從低到高,線程默認的優(yōu)先級是5級。對線程可通過方法setPriority(int)設置優(yōu)先級,通過getPriority()獲知一個線程的優(yōu)先級。有三個常數(shù)用于表示線程的優(yōu)先級:Thread.MIN_PRIORITY、Thread.MAX
PRIORITY、Thread.NORM_PRIORITY,分別對應優(yōu)先級1、10、5。Java程序設計教程-第2版-第11章-Java多線程機制全文共30頁,當前為第12頁。11.4.2線程調(diào)度要理解線程調(diào)度的原理,以及線程執(zhí)行過程,必須理解線程棧模型。線程棧是指某時刻時內(nèi)存中線程調(diào)度的棧信息,當前調(diào)用的方法總是位于棧頂。線程棧的內(nèi)容是隨著程序的運行動態(tài)變化的,程棧必須選擇一個運行的時刻(實際上指代碼運行到什么地方)。下圖所示的代碼說明線程(調(diào)用)棧的變化過程。Java程序設計教程-第2版-第11章-Java多線程機制全文共30頁,當前為第13頁。C目錄ONTENTS11.2線程的創(chuàng)建11.3線程狀態(tài)及轉(zhuǎn)換11.4線程調(diào)度11.5線程常用方法11.6線程同步與鎖機制11.1線程基本概念11.7線程的交互11.8小結(jié)Java程序設計教程-第2版-第11章-Java多線程機制全文共30頁,當前為第14頁。11.5.1常用方法返回類型方法操作staticThreadcurrentThread()返回對當前正在執(zhí)行的線程對象的引用StringgetName()返回該線程的名稱intgetPriority()返回線程的優(yōu)先級voidinterrupt()中斷線程booleanisAlive()測試線程是否處于活動狀態(tài)voidjoin()等待該線程終止voidrun()如果該線程是使用獨立的Runnable運行對象構造的,則調(diào)用該Runnable對象的run方法;否則,該方法不執(zhí)行任何操作并返回。voidsetPriority(intnewPriority)設置線程的優(yōu)先級Java程序設計教程-第2版-第11章-Java多線程機制全文共30頁,當前為第15頁。11.5.1常用方法返回類型方法操作voidsetName(Stringname)改變線程名稱,使之與參數(shù)name相同staticvoidSleep(longmillis)在指定的毫秒數(shù)內(nèi)讓當前正在執(zhí)行的線程休眠(暫停執(zhí)行)staticvoidsleep(longmillis,intnanos)在指定的毫秒數(shù)加指定的納秒數(shù)讓當前正在執(zhí)行的線程休眠(暫停執(zhí)行)voidstart()使該線程可運行voidyield()暫停當前正在執(zhí)行的線程對象,并執(zhí)行其他線程【例11.3】使用線程基本操作方法的例程(本例用到方法setName()、getName()和currentThread())。Example11_03.javaJava程序設計教程-第2版-第11章-Java多線程機制全文共30頁,當前為第16頁。11.5.2線程讓步線程讓步是指暫停當前正在執(zhí)行的線程對象,并執(zhí)行其他線程。如果當前運行的線程優(yōu)先級大于或等于線程池中其他線程的優(yōu)先級,它能得到更多的執(zhí)行時間。如果某線程想讓和它具有相同優(yōu)先級的其他線程獲得運行機會,使用yield()即可。yield()只是令當前線程從運行狀態(tài)轉(zhuǎn)到可運行狀態(tài)。【例11.4】使用線程讓步方法yield()的例程。詳見代碼Example11_04.javaJava程序設計教程-第2版-第11章-Java多線程機制全文共30頁,當前為第17頁。11.5.3線程聯(lián)合Thread的方法join()讓一個線程B與另外一個線程A聯(lián)合,即加到A的尾部。在A執(zhí)行完畢之前B不能執(zhí)行。A執(zhí)行完畢,B才能重新轉(zhuǎn)為可運行狀態(tài)。假設在主線程main中有如下代碼:【例11.5】使用join()方法聯(lián)合線程。Example11_05.java
Threadt=newMyThread();
t.start();t.join();main線程等待t線程執(zhí)行完才能繼續(xù)得到執(zhí)行機會。Java程序設計教程-第2版-第11章-Java多線程機制全文共30頁,當前為第18頁。11.5.4守護線程線程包括用戶線程(UserThread)和守護線程(DaemonThread)。守護線程的作用是為用戶線程提供服務的。守護線程獨立于JVM,一般是由操作系統(tǒng)或者用戶自己創(chuàng)建?!纠?1.6】在程序中設置守護線程。Example11_06.javaJava程序設計教程-第2版-第11章-Java多線程機制全文共30頁,當前為第19頁。C目錄ONTENTS11.2線程的創(chuàng)建11.3線程狀態(tài)及轉(zhuǎn)換11.4線程調(diào)度11.5線程常用方法11.6線程同步與鎖機制11.1線程基本概念11.7線程的交互11.8小結(jié)Java程序設計教程-第2版-第11章-Java多線程機制全文共30頁,當前為第20頁。11.6.1線程同步概述線程同步指的是多個線程同時訪問同一個變量時,一些線程讀數(shù)據(jù),一些線程寫數(shù)據(jù),可能會出現(xiàn)數(shù)據(jù)讀寫錯誤,因此需要對這些線程的數(shù)據(jù)訪問操作進行控制,使之協(xié)調(diào)有序,避免數(shù)據(jù)訪問操作出錯。一個線程在訪問某個對象(數(shù)據(jù)或一組數(shù)據(jù)),其他線程就不能再訪問該對象,這是線程同步的基本思想。Java線程同步控制機制的核心是同步鎖。Synchronized可用于修飾實例方法、類方法代碼塊或者類。不同情況下其作用不同?!纠?1.7】線程應用之從非同步到同步設置的對比例程。Example11_7.javaJava程序設計教程-第2版-第11章-Java多線程機制全文共30頁,當前為第21頁。11.6.2線程安全當一個類已經(jīng)很好地同步以保護它的數(shù)據(jù)時,這個類就稱為線程安全的(Threadsafe)。相反地,線程不安全就是不提供數(shù)據(jù)訪問保護,有可能出現(xiàn)多個線程先后更改數(shù)據(jù)造成所得到的數(shù)據(jù)是無效數(shù)據(jù)。線程安全問題都是由多個線程對共享的變量進行讀寫引起的。JoshuaBloch給出了線程安全性的分類描述方法:不可變、線程安全、有條件線程安全、線程兼容和線程對立。Java程序設計教程-第2版-第11章-Java多線程機制全文共30頁,當前為第22頁。11.6.3線程死鎖當兩個線程被阻塞,每個線程在等待另一個線程時就發(fā)生死鎖。線程發(fā)生死鎖可能性很小,即使看似可能發(fā)生死鎖的代碼,在運行時發(fā)生死鎖的可能性也是小之又小?!纠?1.9】有可能出現(xiàn)死鎖的程序例程。代碼詳見Example11_09.javaJava程序設計教程-第2版-第11章-Java多線程機制全文共30頁,當前為第23頁。C目錄ONTENTS11.2線程的創(chuàng)建11.3線程狀態(tài)及轉(zhuǎn)換11.4線程調(diào)度11.5線程常用方法11.6線程同步與鎖機制11.1線程基本概念11.7線程的交互11.8小結(jié)Java程序設計教程-第2版-第11章-Java多線程機制全文共30頁,當前為第24頁。11.7線程的交互線程間的交互指的是線程之間需要一些協(xié)調(diào)通信,來共同完成一項任務。線程的交互可以通過wait方法和notify方法之實現(xiàn)。返回類型方法操作voidnotify()喚醒在此對象監(jiān)視器上等待的單個線程voidnotifyAll()喚醒在此對象監(jiān)視器上等待的所有線程voidwait()導致當前的線程等待,直到其他線程調(diào)用此對象的notify()方法voidwait(longtimeout)導致當前的線程等待,直到其他線程調(diào)用此對象的notify()方法或notifyAll()方法,或者超過指定的時間量voidwait(longtimeout,intnanos)導致當前的線程等待,直到其他線程調(diào)用此對象的notify()方法或notifyAll()方法,或者其他某個線程中斷當前線程,或者已超過某個實際時間量Java程序設計教程-第2版-第11章-Java多線程機制全文共30頁,當前為第25頁。11.7線程的交互wait/notify方法的使用方法,還需要了解的兩個關鍵點是:(1)必須從同步環(huán)境內(nèi)調(diào)用wait()、notify()、notifyAll()方法,線程擁有對象的鎖才能調(diào)用對象等待或通知方法;(2)多個線程在等待一個對象鎖時候使用notifyAll()?!纠?1.10】線程交互例程:多線程協(xié)作完成計算任務。Example11_10.javaJava程序設計教程-第2版-第11章-Java多線程機制全文共30頁,當前為第26頁。C目錄ONTENTS11.2線程的創(chuàng)建11.3線程狀態(tài)及轉(zhuǎn)換11.4線程調(diào)度11.5線程常用方法11
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)學寄生蟲病防治知識普及文檔
- 幼兒教師家園聯(lián)系工作計劃范文
- 標識標準制作流程及注意細節(jié)
- 電力系統(tǒng)故障快速診斷方法與實踐
- 三年級學生美術能力評價方案
- 醫(yī)院智能化物流管理方案
- 業(yè)主權益保護委托協(xié)議模板
- 兒童繪本《猜猜我有多愛你》拼音版
- 高一物理期中考試題型分析報告
- 教師幫扶計劃實施總結(jié)與反思
- 2025年部編版新教材三年級上冊《9.犟龜》教案
- 2024年南寧市招聘中小學教師筆試真題
- 養(yǎng)老院安全生產(chǎn)培訓
- 老員工帶新員工的培訓制度
- 高標準農(nóng)田建設項目風險評估與應對措施
- 水滸傳每回內(nèi)容梗概
- 人教版初中九年級全冊英語單詞表(完整版)
- 工地試驗室安全培訓內(nèi)容
- 合同車輛質(zhì)押合同
- 2024版數(shù)據(jù)中心基礎設施運維與維保服務合同2篇
- 增材制造課件
評論
0/150
提交評論