版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第十章Java多線程機(jī)制程序是一段靜態(tài)的代碼,它是應(yīng)用程序執(zhí)行的藍(lán)本進(jìn)程是程序的一次動(dòng)態(tài)執(zhí)行,它對(duì)應(yīng)了從代碼加載、執(zhí)行至執(zhí)行完畢的一個(gè)完整過(guò)程線程是進(jìn)程執(zhí)行過(guò)程中產(chǎn)生的多條執(zhí)行線索10.1什么是線程一。程序、進(jìn)程與線程例:ThreadTest.javaclassStudentThreadextendsThread{publicvoidrun(){for(inti=0;i<=5;i++){System.out.println("YouareStudents!");try{sleep(500);}catch(InterruptedExceptione){…}}}}classTeacherThreadextendsThread{publicvoidrun(){for(inti=0;i<=5;i++){System.out.println("IamaTeacher!");try{sleep(300);}catch(InterruptedExceptione){….}}}}publicclassThreadTest{staticStudentThreadstudent;staticTeacherThreadteacher;publicstaticvoidmain(String[]args){teacher=newTeacherThread();student=newStudentThread();teacher.start();student.start();}}10.2多線程實(shí)現(xiàn)Java中實(shí)現(xiàn)多線程應(yīng)用有兩種途徑:創(chuàng)建Thread類的子類在程序中使用Runnable接口用Thread類的子類創(chuàng)建線程一、只需從Thread類派生出一個(gè)子類,在子類中一定要重寫run().例:publicvoidrun(){
…….}}二、然后用該子類創(chuàng)建一個(gè)對(duì)象StudentThreadstudent=newStudentThread();三、用start()方法啟動(dòng)線程
student.start();在程序中實(shí)現(xiàn)多線程,關(guān)鍵性操作:定義用戶線程操作,即run()方法的實(shí)現(xiàn)在適當(dāng)?shù)臅r(shí)候啟動(dòng)線程例:ThreadTest.java
主線程T1.start()Tn.start()T2.Start()
主線程10.2.2Runnable()接口用Runnable()接口實(shí)現(xiàn)多線程時(shí),也必須必須實(shí)現(xiàn)run()方法,也需用start()啟動(dòng)線程,但此時(shí)常用Thread類的構(gòu)造方法來(lái)創(chuàng)建線程對(duì)象例:classBallThreadextendsApplet
implementsRunnable
{publicvoidstart(){thread=newThread(this);thread.start();
…….}……privateThreadthread;}例:一個(gè)模擬小球平拋和自由落體的例子BallThread.javaThread(Runnabletarget)創(chuàng)建一個(gè)新線程,它調(diào)用target的run(),Target是一個(gè)實(shí)現(xiàn)了Runnable接口的類的實(shí)例publicclassBallThreadextendsAppletimplementsRunnable{Threadred,blue;GraphicsredPen,bluePen;intt=0;publicvoidinit(){red=newThread(this);blue=newThread(this);redPen=getGraphics();bluePen=getGraphics();redPen.setColor(Color.red);bluePen.setColor(Color.blue);}publicvoidstart(){red.start();blue.start();}publicvoidrun(){while(true){t=t+1;if(Thread.currentThread()==red){if(t>100)t=0;redPen.clearRect(0,0,110,400);redPen.fillOval(50,(int)(1.0/2*t*9.8),15,15);try{red.sleep(40);}catch(InterruptedExceptione){}}elseif(Thread.currentThread()==blue){bluePen.clearRect(120,0,900,500);bluePen.fillOval(120+7*t,(int)(1.0/2*t*9.8),15,15);try{blue.sleep(40);}catch(InterruptedExceptione){}}}}}線程機(jī)制實(shí)現(xiàn)的關(guān)鍵在于它的“并行性”,怎樣才能讓一個(gè)線程讓出CPU,供其它線程使用呢?API:
start()啟動(dòng)線程對(duì)象run()用來(lái)定義線程對(duì)象被調(diào)度之后所執(zhí)行的操作,用戶必須重寫run()方法yield()強(qiáng)制終止線程的執(zhí)行isAlive()測(cè)試當(dāng)前線程是否在活動(dòng)sleep(intmillsecond)使線程休眠一段時(shí)間,長(zhǎng)短由參數(shù)所決定VoidWait()使線程處于等待狀態(tài)10.3線程的屬性10.3.1線程的生命周期線程一共有四種狀態(tài):新建(new)
可運(yùn)行狀態(tài)
(runnable)
死(dead)
堵塞(blocked)新建(new)線程對(duì)象剛剛創(chuàng)建,還沒有啟動(dòng),此時(shí)還處于不可運(yùn)行狀態(tài)。如:
Threadthread=newThread(“test”)
此時(shí)線程thread處于新建狀態(tài)但已有了相應(yīng)的內(nèi)存空間以及其它資源可運(yùn)行狀態(tài)(runnable)此時(shí)的線程已經(jīng)啟動(dòng),控制已處于線程的run()方法之中此時(shí)的線程可能運(yùn)行,也可能不運(yùn)行,取決于CPU是否空閑。調(diào)用線程的start()方法可使線程處于“可運(yùn)行”狀態(tài)
thread.start();二是當(dāng)線程處于“可運(yùn)行”狀態(tài)時(shí),調(diào)用了stop()方法結(jié)束了線程的運(yùn)行,使其進(jìn)入了死狀態(tài)。
thread.stop();線程死亡的原因有二:一是run()方法中最后一個(gè)語(yǔ)句執(zhí)行完畢死(dead)一個(gè)正在執(zhí)行的線程因特殊原因,被暫停執(zhí)行,進(jìn)入堵塞狀態(tài)堵塞時(shí)線程不能進(jìn)入隊(duì)列排隊(duì),必須等到引起堵塞的原因消除,才可重新進(jìn)入排隊(duì)隊(duì)列引起堵塞的原因很多,不同原因要用不同的方法解除sleep(),wait()是兩個(gè)常用引起堵塞的方法堵塞(blocked)當(dāng)run()執(zhí)行結(jié)束返回時(shí),線程自動(dòng)終止使用stop()也可以終止線程的執(zhí)行在程序中常常調(diào)用interrupt()來(lái)終止線程,interrupt()不僅可中斷正在運(yùn)行的線程,而且也能中斷處于blocked狀態(tài)的線程,此時(shí)interrupt()會(huì)拋出一個(gè)InterruptedException異常Java提供了幾個(gè)用于測(cè)試線程是否被中斷的方法10.3.2.線程中斷API:Voidinterrupt()向一個(gè)線程發(fā)送一個(gè)中斷請(qǐng)求,同時(shí)把這個(gè)線程的“interrupted”狀態(tài)置為true.若該線程處于blocked狀態(tài),會(huì)拋出InterruptedException.Staticbooleaninterrupted()檢測(cè)當(dāng)前線程是否已被中斷,并重置狀態(tài)“interrupted”值為falsebooleanisInterrupted()檢測(cè)當(dāng)前線程是否已被中斷,不改變狀態(tài)“interrupted”值
例:一個(gè)多線程的例子BounceThread.javaclassBallextendsThread{publicBall(JPanelb){box=b;}publicvoidrun(){try{draw();for(inti=1;i<=1000;i++){move();sleep(5);}}catch(InterruptedExceptione){}}……addButton(p,"Start",newActionListener(){publicvoidactionPerformed(ActionEventevt){Ballb=newBall(canvas);b.start();}});………Java的線程調(diào)度采用優(yōu)先級(jí)策略:優(yōu)先級(jí)高的先執(zhí)行,優(yōu)先級(jí)低的后執(zhí)行;多線程系統(tǒng)會(huì)自動(dòng)為每個(gè)線程分配一個(gè)優(yōu)先級(jí),缺省時(shí),繼承其父類的優(yōu)先級(jí)任務(wù)緊急的線程,其優(yōu)先較高優(yōu)先級(jí)的線程按“先進(jìn)先出”的原則10.4線程優(yōu)先級(jí)—BounceExpress.java垃圾回收是一個(gè)優(yōu)先級(jí)很低的線程,當(dāng)CPU空閑,又沒有別的高優(yōu)先級(jí)線程在運(yùn)行,此時(shí)垃圾回收被線程被激活Thread類有三個(gè)與線程優(yōu)先級(jí)有關(guān)的靜態(tài)量:MAX_PRIORITY:最大優(yōu)先權(quán),值為10MIN_PRIORITY:最小優(yōu)先權(quán),值為1NORM_PRIORITY:默認(rèn)優(yōu)先權(quán),值為5API:VoidsetPriority(intnewPriority)
重置線程優(yōu)先級(jí)IntgetPriority()獲得當(dāng)前線程優(yōu)先級(jí)Staticvoidyield()
使當(dāng)前線程放棄執(zhí)行權(quán)用setPriority()改變線程的優(yōu)先級(jí)例:BounceExpress.java………addButton(p,"Start",newActionListener(){publicvoidactionPerformed(ActionEventevt){Ballb=newBall(canvas,Color.black);b.setPriority(Thread.NORM_PRIORITY);b.start();}});addButton(p,"Express",newActionListener(){publicvoidactionPerformed(ActionEventevt){for(inti=0;i<5;i++){Ballb=newBall(canvas,Color.red);b.setPriority(Thread.NORM_PRIORITY+2);b.start();}}});10.5線程同步案例:會(huì)計(jì)和出納同用一帳本的情況會(huì)計(jì)負(fù)責(zé)存款、出納負(fù)責(zé)取款
假設(shè),會(huì)計(jì)每次存入30萬(wàn),共存三次;然后出納開始取款,每次取會(huì)計(jì)存款的一半,共取二次;這個(gè)過(guò)程一共重復(fù)三次。
如果帳面原來(lái)有100萬(wàn),那么會(huì)計(jì)、出納操作完后,帳面應(yīng)該如下:會(huì)計(jì)第一次存款后會(huì)計(jì)第三次存款后會(huì)計(jì)第二次存款后出納第二次取款后出納第一次取款后出納第三次取款后2、用money表示帳本,會(huì)計(jì)、出納都要對(duì)其操作3、設(shè)計(jì)一個(gè)chunqu方法,會(huì)計(jì)、出納利用這個(gè)方法對(duì)帳本money進(jìn)行操作問(wèn)題分析:
1、設(shè)計(jì)兩個(gè)線程,一個(gè)表示會(huì)計(jì)kuaiji、一個(gè)表示出納chuna程序設(shè)計(jì)如下:
publicvoidrun(){if(Thread.currentThread()==kuaiji||Thread.currentThread()==chuna){for(inti=1;i<=3;i++){chunqu(30);}}}publicvoidstart(){kuaiji.start();chuna.start();publicvoidchunqu(intnumber){if(Thread.currentThread()==kuaiji){for(inti=1;i<=3;i++){money=money+number;try{Thread.sleep(1000);}catch(InterruptedExceptione){}text1.append("\n"+money);}}elseif(Thread.currentThread()==chuna){for(inti=1;i<=2;i++){money=money-number/2;try{Thread.sleep(1000);}catch(InterruptedExceptione){}text2.append("\n"+money);}}}運(yùn)行結(jié)果:存在問(wèn)題:在大多數(shù)實(shí)用線程應(yīng)用中,都存在兩個(gè)或兩個(gè)以上的線程需要共享相同的對(duì)象,假設(shè)每個(gè)線程都調(diào)用了改變它狀態(tài)的方法,就會(huì)產(chǎn)生這樣的結(jié)果。
解決:引入線程同步機(jī)制--
synchronized
用synchronized修飾的方法,當(dāng)一個(gè)線程要使用該方法,就只能等待其它線程使用完后,方可使用。
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 安全培訓(xùn)師資管理制度
- 基礎(chǔ)知識(shí)·初級(jí)護(hù)師歷年參考題庫(kù)含答案詳解(5套卷)
- 2025年心身醫(yī)學(xué)科學(xué)科心理疾病診斷與治療試題答案及解析
- 2025年婚姻家庭咨詢師國(guó)家職業(yè)資格考試試題及答案解析
- 等級(jí)考試(行政事務(wù)人員·技師)歷年參考題庫(kù)含答案詳解
- 員工福利與關(guān)愛活動(dòng)互動(dòng)方案
- 2026年廣西經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試模擬測(cè)試卷附答案解析
- 2026年浙江宇翔職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能考試題庫(kù)附答案解析
- 貴州鋁業(yè)集團(tuán)2026高校畢業(yè)生招聘35人(一)備考題庫(kù)附答案解析
- 北京2025年北京電影學(xué)院第二輪招聘筆試歷年參考題庫(kù)附帶答案詳解
- 2025-2026年蘇教版初一歷史上冊(cè)期末熱點(diǎn)題庫(kù)及完整答案
- 規(guī)范園區(qū)環(huán)保工作制度
- 2025年常州機(jī)電職業(yè)技術(shù)學(xué)院高職單招語(yǔ)文2018-2024歷年參考題庫(kù)頻考點(diǎn)含答案解析
- 民間融資居間合同
- 環(huán)境污染損害評(píng)估報(bào)告
- 表面活性劑化學(xué)知識(shí)點(diǎn)
- 《塑料材質(zhì)食品相關(guān)產(chǎn)品質(zhì)量安全風(fēng)險(xiǎn)管控清單》
- 武術(shù)學(xué)校體育器材項(xiàng)目 投標(biāo)方案(技術(shù)方案)
- DL∕T 1057-2023 自動(dòng)跟蹤補(bǔ)償消弧線圈成套裝置技術(shù)條件
- 市場(chǎng)營(yíng)銷部門主管聘用協(xié)議
- 期貨投資說(shuō)課市公開課一等獎(jiǎng)省賽課微課金獎(jiǎng)?wù)n件
評(píng)論
0/150
提交評(píng)論