




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第十五章線程及多線程
本講內(nèi)容線程的定義多線程舉例線程的創(chuàng)建與啟動(dòng)兩種實(shí)現(xiàn)多線程方法的比較本講目標(biāo)線程的創(chuàng)建與啟動(dòng)兩種實(shí)現(xiàn)多線程方法的比較線程的定義什么是程序?程序是一段靜態(tài)的代碼,它是應(yīng)用程序執(zhí)行的藍(lán)本。什么是進(jìn)程?進(jìn)程是指一種正在運(yùn)行的程序,有自己的地址空間。作為藍(lán)本的程序可以被多次加載到系統(tǒng)的不同內(nèi)存區(qū)域分別執(zhí)行,形成不同的進(jìn)程。基于進(jìn)程的特點(diǎn)是允許計(jì)算機(jī)同時(shí)運(yùn)行兩個(gè)或更多的程序。什么是線程?線程是進(jìn)程內(nèi)部單一的一個(gè)順序控制流。一個(gè)進(jìn)程在執(zhí)行過程中,可以產(chǎn)生多個(gè)線程。每個(gè)線程也有自己產(chǎn)生、存在和消亡的過程。進(jìn)程是系統(tǒng)資源分配的單位,可包括多個(gè)線程。線程是獨(dú)立調(diào)度和分派的基本單位,共享進(jìn)程資源。引入進(jìn)程是為了多個(gè)程序并發(fā)執(zhí)行,提高資源的利用率和系統(tǒng)吞吐量引入線程,是為了減少程序在并發(fā)執(zhí)行時(shí)所付出的時(shí)空開銷多線程多線程編程的含義是將程序任務(wù)分成幾個(gè)并行的子任務(wù),常用于網(wǎng)絡(luò)編程中。多線程是與單線程比較而言的普通的Windows采用多線程程序結(jié)構(gòu),其工作原理是:主程序有一個(gè)消息循環(huán),不斷從消息隊(duì)列中讀入消息來(lái)決定下一步所要干的事情,一般是針對(duì)一個(gè)函數(shù),只有等這個(gè)函數(shù)執(zhí)行完之后,主程序才能接收另外的消息來(lái)執(zhí)行。在執(zhí)行這個(gè)子函數(shù)過程中你什么也不能干,但往往讀網(wǎng)絡(luò)數(shù)據(jù)和等待用戶輸入有很多時(shí)間處于等待狀態(tài),多線程利用這個(gè)特點(diǎn)將任務(wù)分成多個(gè)并發(fā)任務(wù)后,就可以解決這個(gè)問題多線程的好處多線程的優(yōu)點(diǎn)多線程使系統(tǒng)的空轉(zhuǎn)時(shí)間最少,提高CPU利用率共享資源,不浪費(fèi)內(nèi)存。線程間的信息傳遞容易。線程控制靈活,可在程序中自由調(diào)度。如何實(shí)現(xiàn)多線程?Java中實(shí)現(xiàn)多線程的類有兩種方法:擴(kuò)展java.lang.Thread類,覆蓋Thread類的run方法。生成實(shí)現(xiàn)java.lang.Runnable接口的類并將其它的實(shí)例與java.lang.Thread實(shí)例相關(guān)聯(lián)。Thread類是負(fù)責(zé)向其它類提供線程支持的最主要的類,要使用一個(gè)類具有線程功能,在Java中只要簡(jiǎn)單地從Thread類派生一個(gè)子類就可以了。多線程舉例—Thread類classThreadDemo1{ public
static
voidmain(Stringargs[]){
MyThreadt=newMyThread(); t.start(); while(true){ System.out.println("mainthreadisrunning"); } }}classMyThreadextendsThread{ public
void
run(){
while(true){ System.out.println(Thread.currentThread().getName()+"isrunning"); } }}多線程舉例—Runnable接口classThreadDemo1{ public
static
voidmain(Stringargs[]){
MyThreadmt=newMyThread(); Threadt=newThread(mt); t.start();
while(true){ System.out.println("mainthreadisrunning"); } }}classMyThreadimplementsRunnable{
public
void
run(){
while(true){ System.out.println(Thread.currentThread().getName()+"isrunning"); } }}線程的創(chuàng)建與啟動(dòng)兩種方法來(lái)創(chuàng)建線程:繼承Java.lang.Thread類,并覆蓋run()方法。classMyThreadextendsThread{publicvoidrun(){/*覆蓋該方法*/}}實(shí)現(xiàn)Java.lang.Runnable接口,并實(shí)現(xiàn)run()方法。 classMyThreadimplementsRunnable{publicvoidrun(){/*實(shí)現(xiàn)該方法*/}}線程的創(chuàng)建與啟動(dòng)新建的線程不會(huì)自動(dòng)開始運(yùn)行,必須通過start()方法啟動(dòng)線程。如果不調(diào)用這個(gè)方法,線程將不會(huì)運(yùn)行。也就是說(shuō)可以事先創(chuàng)建線程,并在需要的時(shí)候才啟動(dòng)他們。如:繼承Thread的線程:MyThreadt=newMyThread();t.start();實(shí)現(xiàn)Runnable接口的線程:MyThreadmt=newMyThread();Threadt=newThread(mt);t.start();線程的創(chuàng)建與啟動(dòng)主線程介紹在Java程序啟動(dòng)時(shí),一個(gè)線程立刻運(yùn)行,該線程通常稱為程序的主線程。Main就是在這個(gè)線程上運(yùn)行。當(dāng)不再產(chǎn)生新的線程時(shí),程序是單線程的。主線程的重要性體現(xiàn)在兩個(gè)方面:它是產(chǎn)生其他子線程的線程。通常它必須最后完成執(zhí)行,因?yàn)樗鼒?zhí)行各種關(guān)閉動(dòng)作線程的四種狀態(tài)新狀態(tài):線程已被創(chuàng)建但尚未執(zhí)行(start()尚未被調(diào)用)??蓤?zhí)行狀態(tài):線程可以執(zhí)行,雖然不一定正在執(zhí)行。CPU時(shí)間隨時(shí)可能被分配給該線程,從而使得它執(zhí)行。死亡狀態(tài):正常情況下run()返回使得線程死亡。調(diào)用stop()或destroy()亦有同樣效果,但是不被推薦,前者會(huì)產(chǎn)生異常,后者是強(qiáng)制終止,不會(huì)釋放鎖。阻塞狀態(tài):線程不會(huì)被分配CPU時(shí)間,無(wú)法執(zhí)行。線程的創(chuàng)建與啟動(dòng)方法用途staticThreadcurrentThread()得到當(dāng)前線程finalStringgetName()返回線程的名稱finalvoidsetName(Stringname)將線程的名稱設(shè)置為由name指定的名稱voidstart()調(diào)用run()方法啟動(dòng)線程,開始線程的執(zhí)行voidrun()存放線程體代碼Thread中常用方法線程的創(chuàng)建與啟動(dòng)示例得到當(dāng)前線程,并為其改名例子publicclassMainThreadDemo{publicstaticvoidmain(Stringargs[]){
Threadt=Thread.currentThread();System.out.println(“當(dāng)前線程名稱是:"+t.getName());
t.setName("MyJavaThread");
System.out.println(“改名后線程名稱是:"+t.getName());System.out.println("輸出當(dāng)前線程"+t);}}兩種實(shí)現(xiàn)多線程方法的比較classMyThreadextendsThread{private
inttickets=100;public
voidrun(){while(true){if(tickets>0)System.out.println(Thread.currentThread().getName()+"issallingticket"+tickets--);}}}classTest{public
static
voidmain(String[]args){MyThreadmt=newMyThread();mt.start();mt.start();mt.start();mt.start();}}使用extendsThread方法一個(gè)Thread對(duì)象只能啟動(dòng)一個(gè)線程,無(wú)論調(diào)用幾次start()方法結(jié)果:一個(gè)窗口賣了100張票,其他窗口未賣實(shí)例:實(shí)現(xiàn)四個(gè)窗口共賣100張票效果兩種實(shí)現(xiàn)多線程方法的比較classMyThreadextendsThread{private
inttickets=10;public
voidrun(){while(true){if(tickets>0)System.out.println(Thread.currentThread().getName()+"issallingticket"+tickets--);}}}classTest{public
static
voidmain(String[]args){newMyThread().start();newMyThread().start();newMyThread().start();newMyThread().start();}}使用extendsThread方法結(jié)果:四個(gè)窗口各賣了100張票實(shí)例:實(shí)現(xiàn)四個(gè)窗口共賣100張票效果兩種實(shí)現(xiàn)多線程方法的比較classMyThreadimplementsRunnable{private
inttickets=100;public
voidrun(){while(true){if(tickets>0)System.out.println(Thread.currentThread().getName()+"issallingticket"+tickets--);}}}classTest{public
static
voidmain(String[]args){MyThreadmt=newMyThread();newThread(mt).start();newThread(mt).start();newThread(mt).start();newThread(mt).start();}}使用implementsRunable方法結(jié)果:四個(gè)窗口共賣了100張票實(shí)例:實(shí)現(xiàn)四個(gè)窗口共賣100張票效果兩種實(shí)現(xiàn)多線程方法的比較使用Runnable接口創(chuàng)建多線程的優(yōu)點(diǎn):同一個(gè)Runnable對(duì)象可以傳遞給多個(gè)線程,可以實(shí)現(xiàn)資源共享,所以適合多個(gè)相同程序代碼的線程去處理同一資源的情況可以避免由于Java的單繼承帶來(lái)的局限有利于程序的健壯性,代碼能被多個(gè)線程共享,代碼與數(shù)據(jù)是獨(dú)立的線程的優(yōu)先級(jí)線程在優(yōu)先級(jí)代表該線程的重要程度線程的優(yōu)先指當(dāng)有多個(gè)線程同時(shí)處于可執(zhí)行狀態(tài)并等待獲得CPU時(shí)間時(shí),線程調(diào)度系統(tǒng)根據(jù)各個(gè)線程的優(yōu)先級(jí)來(lái)決定給誰(shuí)分配CPU時(shí)間,優(yōu)先級(jí)高的線程有更大的機(jī)會(huì)獲得CPU時(shí)間,優(yōu)先級(jí)低的線程也不是沒有機(jī)會(huì),只是機(jī)會(huì)要小一些罷了。
可調(diào)用Thread類的方法getPriority()和setPriority()來(lái)獲取或設(shè)置線程的優(yōu)先級(jí)線程的優(yōu)先級(jí)界于1(MIN_PRIORITY)和10(MAX_PRIORITY)之間,缺省是(NORM_PRIORITY)??蛻舸嫒】疃嗑€程實(shí)例產(chǎn)生數(shù)據(jù)不一致的原因多個(gè)線程并發(fā)訪問了同一個(gè)對(duì)象,如果破壞了不可分割的操作,從而就會(huì)造成數(shù)據(jù)不一致被多線程并發(fā)訪問時(shí)如果一個(gè)對(duì)象有可能出現(xiàn)數(shù)據(jù)不一致的問題,那么這個(gè)對(duì)象稱為線程不安全的對(duì)象線程同步如何解決多線程并發(fā)訪問的問題
synchronized(object){
代碼塊
}線程同步線程同步線程同步線程的管理線程包括new()開始、running()運(yùn)行、wait()等候和done()結(jié)束執(zhí)行四種狀態(tài)。第一次創(chuàng)建線程時(shí),都位于new狀態(tài),在這個(gè)狀態(tài)下,不能運(yùn)行線程,只能等待。這時(shí),線程要么調(diào)用start方法開始運(yùn)行,要么送往done狀態(tài)結(jié)束。位于done中的線程已經(jīng)結(jié)束執(zhí)行,這是線程的最后一個(gè)狀態(tài)。一旦線程位于這個(gè)狀態(tài),就不能再次出現(xiàn),而且當(dāng)Java虛擬機(jī)中的所有線程都位于done狀態(tài)時(shí),程序就強(qiáng)行中止。線程的管理當(dāng)前正在執(zhí)行的所有線程都位于running狀態(tài),在程序之間用某種方法把處理器的執(zhí)行時(shí)間分成時(shí)間片。位于running狀態(tài)的每個(gè)線程都是能運(yùn)行的,但在一個(gè)給定的時(shí)間內(nèi),每個(gè)系統(tǒng)處理器只能運(yùn)行一個(gè)線程。與位于running
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國(guó)三足式袋卸料離心機(jī)數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 深度解析教育科技行業(yè)未來(lái)發(fā)展方向
- 教育機(jī)構(gòu)如何利用游戲化平臺(tái)提高教學(xué)效果
- 企業(yè)培訓(xùn)中多媒體技術(shù)的應(yīng)用與創(chuàng)新-以智慧教室為例
- 新版培訓(xùn)課件模板圖片
- 碧桂園張家港拓客內(nèi)部培訓(xùn)89
- 全民健身設(shè)施補(bǔ)短板工程實(shí)施方案在城市老舊小區(qū)健身設(shè)施改造中的應(yīng)用研究
- 全球鈾礦資源市場(chǎng)前景與2025年核能產(chǎn)業(yè)綠色低碳發(fā)展戰(zhàn)略報(bào)告
- 公交優(yōu)先戰(zhàn)略在2025年城市交通擁堵治理中的可持續(xù)發(fā)展報(bào)告
- Carpetimycin-B-生命科學(xué)試劑-MCE
- 板式換熱器、半容積式換熱器換熱器面積計(jì)算表(自動(dòng)計(jì)算)
- 直流屏檢修作業(yè)指導(dǎo)書
- 冷鐓機(jī) 質(zhì)量要求技術(shù)條件
- 《全國(guó)統(tǒng)一安裝工程預(yù)算定額》工程量計(jì)算規(guī)則
- translated-NCCN臨床實(shí)踐指南:非小細(xì)胞肺癌(中文版2022.V5)
- GB/T 8312-2002茶咖啡堿測(cè)定
- 通信線路工程施工組織設(shè)計(jì)方案【實(shí)用文檔】doc
- 護(hù)士注冊(cè)健康體檢表下載【可直接打印版本】
- 預(yù)計(jì)財(cái)務(wù)報(bào)表編制及分析課件
- Q∕SY 1347-2010 石油化工蒸汽透平式壓縮機(jī)組節(jié)能監(jiān)測(cè)方法
- 西門子順序功能圖語(yǔ)言S7-Graph的應(yīng)用
評(píng)論
0/150
提交評(píng)論