7.1多線程的概念
多線程編程的含義是你可將程序任務(wù)分成幾個(gè)并行的子任務(wù)。特別是在網(wǎng)絡(luò)編程中,你會(huì)發(fā)現(xiàn)很多功能是可以并發(fā)執(zhí)行的。比如網(wǎng)絡(luò)傳輸速度較慢,用戶輸入速度較慢,你可以用兩個(gè)獨(dú)立的線程去完成這?copy;功能,而不影響正常的顯示或其他功能。多線程是與單線程比較而言的,普通的WINDOWS采用單線程程序結(jié)構(gòu),其工作原理是:主程序有一個(gè)消息循環(huán),不斷從消息隊(duì)列中讀入消息來決定下一步所要干的事情,一般是一個(gè)子函數(shù),只有等這個(gè)子函數(shù)執(zhí)行完返回后,主程序才能接收另外的消息來執(zhí)行。比如子函數(shù)功能是在讀一個(gè)網(wǎng)絡(luò)數(shù)據(jù),或讀一個(gè)文件,只有等讀完這?copy;數(shù)據(jù)或文件才能接收下一個(gè)消息。在執(zhí)行這個(gè)子函數(shù)過程中你什么也不能干。但往往讀網(wǎng)絡(luò)數(shù)據(jù)和等待用戶輸入有很多時(shí)間處于等待狀態(tài),多線程利用這個(gè)特點(diǎn)將任務(wù)分成多個(gè)并發(fā)任務(wù)后,就可以解決這個(gè)問題。
7.1.1Java線程的模型
Java的設(shè)計(jì)思想是建立在當(dāng)前大多數(shù)操作系統(tǒng)都實(shí)現(xiàn)了線程調(diào)度。Java虛擬機(jī)的很多任務(wù)都依賴線程調(diào)度,而且所有的類庫都是為多線程設(shè)計(jì)的。實(shí)時(shí)上,Java支持Macintosh和Ms-dos的平臺(tái)?reg;所以遲遲未出來就是因?yàn)檫@兩個(gè)平臺(tái)都不支持多線程。Java利用多線程實(shí)現(xiàn)了整個(gè)執(zhí)行環(huán)境是異步的。在Java程序里沒有主消息循環(huán)。如果一個(gè)線程等待讀取網(wǎng)絡(luò)數(shù)據(jù),它可以運(yùn)行但不停止系統(tǒng)的其他線程執(zhí)行。用于處理用戶輸入的線程大多時(shí)間是等待用戶敲鍵盤或擊鼠標(biāo)。你還可以使動(dòng)畫的每一幀?reg;間停頓一秒而并不使系統(tǒng)暫停。一?copy;線程啟動(dòng)后,它可以被掛起,暫時(shí)不讓它執(zhí)行。掛起的線程可以重新恢復(fù)執(zhí)行。任何時(shí)間線程都可以被停止,被停止的線程就不能再重新啟動(dòng)。Java語言里,線程表現(xiàn)為線程類,線程類封裝了所有需要的線程操作控制。在你心里,必須很清晰地區(qū)分開線程對(duì)象和運(yùn)行線程,你可以將線程對(duì)象看作是運(yùn)行線程的控制面板。在線程對(duì)象里有很多函數(shù)來控制一個(gè)線程是否運(yùn)行,睡眠,掛起或停止。線程類是控制線程行為的唯一的手段。一?copy;一個(gè)Java程序啟動(dòng)后,就已經(jīng)有一個(gè)線程在運(yùn)行。你可通過調(diào)用Thread.currentThread函數(shù)來查看當(dāng)前運(yùn)行的是哪一個(gè)線程。
你得到一個(gè)線程的控制柄,你就可以作很有趣的事情,即使單線程也一樣。下面這個(gè)例子讓你知道怎樣操縱當(dāng)前線程。Filename:testthread
classtestthread{publicstaticvoidmain(Stringargs[]){Threadt
=Thread.currentThread();t.setName(\"ThisThreadisrunning\");
System.out.println(\"Therunningthread:\"+t);try{for(inti=0;i
{System.out.println(\"Sleeptime\"+i);Thread.sleep(1000);}
}catch(InterruptedExceptione){System.out.println(\"threadhaswrong\");}
}}
執(zhí)行結(jié)果:javatestthreadTherunningthread:Thread[ThisThreadisrunning,5,main]Sleeptime0Sleeptime1Sleeptime2Sleeptime3Sleeptime4
7.1.2啟動(dòng)接口
一個(gè)線程并不激動(dòng)人心,多個(gè)線程才有實(shí)際意義。我們?cè)鯓觿?chuàng)建更多的線程呢?我們需要?jiǎng)?chuàng)建線程類的另一個(gè)實(shí)例。當(dāng)我們構(gòu)造了線程類的一個(gè)新的實(shí)例,我們必須告訴它在新的線程里應(yīng)執(zhí)行哪一段程序。你可以在任意實(shí)現(xiàn)了啟動(dòng)接口的對(duì)象上啟動(dòng)一個(gè)線程。啟動(dòng)接口是一個(gè)抽象接口,來表示本對(duì)象有一?copy;函數(shù)想異步執(zhí)行。要實(shí)現(xiàn)啟動(dòng)接口,一個(gè)類只需要有一個(gè)叫run的函數(shù)。下面是創(chuàng)建一個(gè)新線程的例子:
Filename:twothread.java
classtwothreadimplementsRunnable{twothread(){Threadt1
=Thread.currentThread();t1.setName(\"Thefirstmainthread\");
System.out.println(\"Therunningthread:\"+t1);Threadt2=new
Thread(this,\"thesecondthread\");System.out.println(\"creatanother
thread\");t2.start();try{System.out.println(\"firstthreadwill
sleep\");Thread.sleep(3000);}catch(InterruptedExceptione)
{System.out.println(\"firstthreadhaswrong\");}
System.out.println(\"firstthreadexit\");}publicvoidrun(){try{for
(inti=0;i
Thread.sleep(1000);}
}catch(InterruptedExceptione){System.out.println(\"threadhas
wrong\");}
System.out.println(\"secondthreadexit\");}publicstaticvoid
main(Stringargs[]){newtwothread();}}
執(zhí)行結(jié)果:javatwothread
Therunningthread:Thread[Thefirstmainthread,5,main]creatanother
threadfirstthreadwillsleepSleeptimeforthread2:0Sleeptimefor
thread2:1Sleeptimeforthread2:2firstthreadexitSleeptimefor
thread2:3Sleeptimeforthread2:4secondthreadexit
main線程用newThread(this,\"thesecondthread\")創(chuàng)建了一個(gè)Thread對(duì)象,通過傳遞第一個(gè)參數(shù)來標(biāo)明新線程來調(diào)用this對(duì)象的run函數(shù)。然后我們調(diào)用start函數(shù),它將使線程從run函數(shù)開始執(zhí)行。
2015年全國(guó)職稱計(jì)算機(jī)考試教材(2007模 .. 定價(jià):¥225 優(yōu)惠價(jià):¥213 更多書籍 | |
全國(guó)職稱計(jì)算機(jī)考試速成過關(guān)系列套裝:W .. 定價(jià):¥133 優(yōu)惠價(jià):¥133.0 更多書籍 |