資源描述:
《java 多線程編程詳解48308》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、資料來(lái)源于網(wǎng)絡(luò)PDF版本由fantasybob制作Java多線程編程詳解我們不妨設(shè)想,為了創(chuàng)建一個(gè)新的線程,我們需要做些什么?很顯然,我們必須指明這個(gè)線程所要執(zhí)行的代碼,而這就是在Java中實(shí)現(xiàn)多線程我們所需要做的一切!真是神奇!Java是如何做到這一點(diǎn)的?通過(guò)類!作為一個(gè)完全面向?qū)ο蟮恼Z(yǔ)言,Java提供了類java.lang.Thread來(lái)方便多線程編程,這個(gè)類提供了大量的方法來(lái)方便我們控制自己的各個(gè)線程,我們以后的討論都將圍繞這個(gè)類進(jìn)行。那么如何提供給Java我們要線程執(zhí)行的代碼呢?讓我們來(lái)看一看Thread類。Thread類最重要的方法是run(),它為Thread類的方法st
2、art()所調(diào)用,提供我們的線程所要執(zhí)行的代碼。為了指定我們自己的代碼,只需要覆蓋它!方法一:繼承Thread類,覆蓋方法run()我們?cè)趧?chuàng)建的Thread類的子類中重寫(xiě)run(),加入線程所要執(zhí)行的代碼即可。下面是一個(gè)例子:publicclassMyThreadextendsThread{intcount=1,number;publicMyThread(intnum){number=num;System.out.println("創(chuàng)建線程"+number);}publicvoidrun(){while(true){System.out.println("線程"+number+":計(jì)
3、數(shù)"+count);if(++count==6)return;}}publicstaticvoidmain(Stringargs[]){for(inti=0;i<5;i++)newMyThread(i+1).start();}}這種方法簡(jiǎn)單明了,符合大家的習(xí)慣,但是,它也有一個(gè)很大的缺點(diǎn),那就是如果我們的類已經(jīng)從一個(gè)類繼承(如小程序必須繼承自Applet類),則無(wú)法再繼承Thread類,這時(shí)如果我們又不想建立一個(gè)新的類,應(yīng)該怎么辦呢?我們不妨來(lái)探索一種新的方法:我們不創(chuàng)建Thread類的子類,而是直接使用它,那么我們只能將我們的方法作為參數(shù)傳遞給Thread類的實(shí)例,有點(diǎn)類似回調(diào)函數(shù)
4、。但是Java沒(méi)有指針,我們只能傳遞一個(gè)包含這個(gè)方法的類的實(shí)例。那么如何限制這個(gè)類必須包含這一方法呢?當(dāng)然是使用接口!(雖然抽象類也可滿足,但是需要繼承,而我們之所以要采用這種新方法,不就是為了避免繼承帶來(lái)的限制嗎?)Java提供了接口java.lang.Runnable來(lái)支持這種方法。資料來(lái)源于網(wǎng)絡(luò)PDF版本由fantasybob制作方法二:實(shí)現(xiàn)Runnable接口Runnable接口只有一個(gè)方法run(),我們聲明自己的類實(shí)現(xiàn)Runnable接口并提供這一方法,將我們的線程代碼寫(xiě)入其中,就完成了這一部分的任務(wù)。但是Runnable接口并沒(méi)有任何對(duì)線程的支持,我們還必須創(chuàng)建Thre
5、ad類的實(shí)例,這一點(diǎn)通過(guò)Thread類的構(gòu)造函數(shù)publicThread(Runnabletarget);來(lái)實(shí)現(xiàn)。下面是一個(gè)例子:publicclassMyThreadimplementsRunnable{intcount=1,number;publicMyThread(intnum){number=num;System.out.println("創(chuàng)建線程"+number);}publicvoidrun(){while(true){System.out.println("線程"+number+":計(jì)數(shù)"+count);if(++count==6)return;}}publicstat
6、icvoidmain(Stringargs[]){for(inti=0;i<5;i++)newThread(newMyThread(i+1)).start();}}嚴(yán)格地說(shuō),創(chuàng)建Thread子類的實(shí)例也是可行的,但是必須注意的是,該子類必須沒(méi)有覆蓋Thread類的run方法,否則該線程執(zhí)行的將是子類的run方法,而不是我們用以實(shí)現(xiàn)Runnable接口的類的run方法,對(duì)此大家不妨試驗(yàn)一下。使用Runnable接口來(lái)實(shí)現(xiàn)多線程使得我們能夠在一個(gè)類中包容所有的代碼,有利于封裝,它的缺點(diǎn)在于,我們只能使用一套代碼,若想創(chuàng)建多個(gè)線程并使各個(gè)線程執(zhí)行不同的代碼,則仍必須額外創(chuàng)建類,如果這樣的話
7、,在大多數(shù)情況下也許還不如直接用多個(gè)類分別繼承Thread來(lái)得緊湊。綜上所述,兩種方法各有千秋,大家可以靈活運(yùn)用。下面讓我們一起來(lái)研究一下多線程使用中的一些問(wèn)題。三:線程的七種狀態(tài)下面為線程中的7中非常重要的狀態(tài):(有的書(shū)上也只有認(rèn)為前五種狀態(tài):而將“鎖池”和“等待池”都看成是“阻塞”狀態(tài)的特殊情況:這種認(rèn)識(shí)也是正確的,但是將“鎖池”和“等待池”單獨(dú)分離出來(lái)有利于對(duì)程序的理解)1.初始狀態(tài),線程創(chuàng)建,線程對(duì)象調(diào)用start()方法。資料來(lái)源于網(wǎng)絡(luò)PDF版本