7.1多線程的概念
多線程編程的含義是你可將程序任務分成幾個并行的子任務。特別是在網(wǎng)絡編程中,你會發(fā)現(xiàn)很多功能是可以并發(fā)執(zhí)行的。比如網(wǎng)絡傳輸速度較慢,用戶輸入速度較慢,你可以用兩個獨立的線程去完成這?copy;功能,而不影響正常的顯示或其他功能。多線程是與單線程比較而言的,普通的WINDOWS采用單線程程序結(jié)構(gòu),其工作原理是:主程序有一個消息循環(huán),不斷從消息隊列中讀入消息來決定下一步所要干的事情,一般是一個子函數(shù),只有等這個子函數(shù)執(zhí)行完返回后,主程序才能接收另外的消息來執(zhí)行。比如子函數(shù)功能是在讀一個網(wǎng)絡數(shù)據(jù),或讀一個文件,只有等讀完這?copy;數(shù)據(jù)或文件才能接收下一個消息。在執(zhí)行這個子函數(shù)過程中你什么也不能干。但往往讀網(wǎng)絡數(shù)據(jù)和等待用戶輸入有很多時間處于等待狀態(tài),多線程利用這個特點將任務分成多個并發(fā)任務后,就可以解決這個問題。
7.1.1Java線程的模型
Java的設計思想是建立在當前大多數(shù)操作系統(tǒng)都實現(xiàn)了線程調(diào)度。Java虛擬機的很多任務都依賴線程調(diào)度,而且所有的類庫都是為多線程設計的。實時上,Java支持Macintosh和Ms-dos的平臺?reg;所以遲遲未出來就是因為這兩個平臺都不支持多線程。Java利用多線程實現(xiàn)了整個執(zhí)行環(huán)境是異步的。在Java程序里沒有主消息循環(huán)。如果一個線程等待讀取網(wǎng)絡數(shù)據(jù),它可以運行但不停止系統(tǒng)的其他線程執(zhí)行。用于處理用戶輸入的線程大多時間是等待用戶敲鍵盤或擊鼠標。你還可以使動畫的每一幀?reg;間停頓一秒而并不使系統(tǒng)暫停。一?copy;線程啟動后,它可以被掛起,暫時不讓它執(zhí)行。掛起的線程可以重新恢復執(zhí)行。任何時間線程都可以被停止,被停止的線程就不能再重新啟動。Java語言里,線程表現(xiàn)為線程類,線程類封裝了所有需要的線程操作控制。在你心里,必須很清晰地區(qū)分開線程對象和運行線程,你可以將線程對象看作是運行線程的控制面板。在線程對象里有很多函數(shù)來控制一個線程是否運行,睡眠,掛起或停止。線程類是控制線程行為的唯一的手段。一?copy;一個Java程序啟動后,就已經(jīng)有一個線程在運行。你可通過調(diào)用Thread.currentThread函數(shù)來查看當前運行的是哪一個線程。
你得到一個線程的控制柄,你就可以作很有趣的事情,即使單線程也一樣。下面這個例子讓你知道怎樣操縱當前線程。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啟動接口
一個線程并不激動人心,多個線程才有實際意義。我們怎樣創(chuàng)建更多的線程呢?我們需要創(chuàng)建線程類的另一個實例。當我們構(gòu)造了線程類的一個新的實例,我們必須告訴它在新的線程里應執(zhí)行哪一段程序。你可以在任意實現(xiàn)了啟動接口的對象上啟動一個線程。啟動接口是一個抽象接口,來表示本對象有一?copy;函數(shù)想異步執(zhí)行。要實現(xiàn)啟動接口,一個類只需要有一個叫run的函數(shù)。下面是創(chuàng)建一個新線程的例子:
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)建了一個Thread對象,通過傳遞第一個參數(shù)來標明新線程來調(diào)用this對象的run函數(shù)。然后我們調(diào)用start函數(shù),它將使線程從run函數(shù)開始執(zhí)行。
![]() | ![]() .. 定價:¥225 優(yōu)惠價:¥213 更多書籍 |
![]() | ![]() .. 定價:¥133 優(yōu)惠價:¥133.0 更多書籍 |