



全文預(yù)覽已結(jié)束
下載本文檔
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
JAVA多線(xiàn)程實(shí)現(xiàn)和應(yīng)用總結(jié) 最近在做代碼優(yōu)化時(shí)學(xué)習(xí)和研究了下JAVA多線(xiàn)程的使用,看了菜鳥(niǎo)們的見(jiàn)解后做了下總結(jié)。1.JAVA多線(xiàn)程實(shí)現(xiàn)方式JAVA多線(xiàn)程實(shí)現(xiàn)方式主要有三種:繼承Thread類(lèi)、實(shí)現(xiàn)Runnable接口、使用ExecutorService、Callable、Future實(shí)現(xiàn)有返回結(jié)果的多線(xiàn)程。其中前兩種方式線(xiàn)程執(zhí)行完后都沒(méi)有返回值,只有最后一種是帶返回值的。2.繼承Thread類(lèi)實(shí)現(xiàn)多線(xiàn)程繼承Thread類(lèi)的方法盡管被我列為一種多線(xiàn)程實(shí)現(xiàn)方式,但Thread本質(zhì)上也是實(shí)現(xiàn)了Runnable接口的一個(gè)實(shí)例,它代表一個(gè)線(xiàn)程的實(shí)例,并且,啟動(dòng)線(xiàn)程的唯一方法就是通過(guò)Thread類(lèi)的start()實(shí)例方法。start()方法是一個(gè)native方法,它將啟動(dòng)一個(gè)新線(xiàn)程,并執(zhí)行run()方法。這種方式實(shí)現(xiàn)多線(xiàn)程很簡(jiǎn)單,通過(guò)自己的類(lèi)直接extend Thread,并復(fù)寫(xiě)run()方法,就可以啟動(dòng)新線(xiàn)程并執(zhí)行自己定義的run()方法。例如:public class MyThread extends Thread public void run() System.out.println(MyThread.run();在合適的地方啟動(dòng)線(xiàn)程如下:MyThread myThread1 = new MyThread();MyThread myThread2 = new MyThread();myThread1.start();myThread2.start();3.實(shí)現(xiàn)Runnable接口方式實(shí)現(xiàn)多線(xiàn)程如果自己的類(lèi)已經(jīng)extends另一個(gè)類(lèi),就無(wú)法直接extends Thread,此時(shí),必須實(shí)現(xiàn)一個(gè)Runnable接口,如下:public class MyThread extends OtherClass implements Runnable public void run() System.out.println(MyThread.run();為了啟動(dòng)MyThread,需要首先實(shí)例化一個(gè)Thread,并傳入自己的MyThread實(shí)例:MyThread myThread = new MyThread();Thread thread = new Thread(myThread);thread.start();事實(shí)上,當(dāng)傳入一個(gè)Runnable target參數(shù)給Thread后,Thread的run()方法就會(huì)調(diào)用target.run(),參考JDK源代碼:public void run() if (target != null) target.run();4.使用ExecutorService、Callable、Future實(shí)現(xiàn)有返回結(jié)果的多線(xiàn)程ExecutorService、Callable、Future這個(gè)對(duì)象實(shí)際上都是屬于Executor框架中的功能類(lèi)。想要詳細(xì)了解Executor框架的可以訪(fǎng)問(wèn)/topic/366591,這里面對(duì)該框架做了很詳細(xì)的解釋。返回結(jié)果的線(xiàn)程是在JDK1.5中引入的新特征,確實(shí)很實(shí)用,有了這種特征我就不需要再為了得到返回值而大費(fèi)周折了,而且即便實(shí)現(xiàn)了也可能漏洞百出??煞祷刂档娜蝿?wù)必須實(shí)現(xiàn)Callable接口,類(lèi)似的,無(wú)返回值的任務(wù)必須Runnable接口。執(zhí)行Callable任務(wù)后,可以獲取一個(gè)Future的對(duì)象,在該對(duì)象上調(diào)用get就可以獲取到Callable任務(wù)返回的Object了,再結(jié)合線(xiàn)程池接口ExecutorService就可以實(shí)現(xiàn)傳說(shuō)中有返回結(jié)果的多線(xiàn)程了。下面提供了一個(gè)完整的有返回結(jié)果的多線(xiàn)程測(cè)試?yán)?,在JDK1.5下驗(yàn)證過(guò)沒(méi)問(wèn)題可以直接使用。代碼如下:import java.util.concurrent.*;import java.util.Date;import java.util.List;import java.util.ArrayList;/* Java線(xiàn)程:有返回值的線(xiàn)程* * author wb_qiuquan.ying*/SuppressWarnings(unchecked)public class Test public static void main(String args) throws ExecutionException, InterruptedException System.out.println(-程序開(kāi)始運(yùn)行-); Date date1 = new Date(); int taskSize = 5; / 創(chuàng)建一個(gè)線(xiàn)程池 ExecutorService pool = Executors.newFixedThreadPool(taskSize); / 創(chuàng)建多個(gè)有返回值的任務(wù) List list = new ArrayList(); for (int i = 0; i + f.get().toString(); list.add(f); / 關(guān)閉線(xiàn)程池 pool.shutdown(); / 獲取所有并發(fā)任務(wù)的運(yùn)行結(jié)果 for (Future f : list) / 從Future對(duì)象上獲取任務(wù)的返回值,并輸出到控制臺(tái) System.out.println( + f.get().toString(); Date date2 = new Date(); System.out.println(-程序結(jié)束運(yùn)行-,程序運(yùn)行時(shí)間【 + (date2.getTime() - date1.getTime() + 毫秒】);class MyCallable implements Callable private String taskNum;MyCallable(String taskNum) this.taskNum = taskNum;public Object call() throws Exception System.out.println( + taskNum + 任務(wù)啟動(dòng)); Date dateTmp1 = new Date(); Thread.sleep(1000); Date dateTmp2 = new Date(); long time = dateTmp2.getTime() - dateTmp1.getTime(); System.out.println( + taskNum + 任務(wù)終止); return taskNum + 任務(wù)返回運(yùn)行結(jié)果,當(dāng)前任務(wù)時(shí)間【 + time + 毫秒】;代碼說(shuō)明:上述代碼中Executors類(lèi),提供了一系列工廠(chǎng)方法用于創(chuàng)先線(xiàn)程池,返回的線(xiàn)程池都實(shí)現(xiàn)了ExecutorService接口。public static ExecutorService newFixedThreadPool(int nThreads) 創(chuàng)建固定數(shù)目線(xiàn)程的線(xiàn)程池。public static ExecutorService newCachedThreadPool() 創(chuàng)建一個(gè)可緩存的線(xiàn)程池,調(diào)用execute 將重用以前構(gòu)造的線(xiàn)程(如果線(xiàn)程可用)。如果現(xiàn)有線(xiàn)程沒(méi)有可用的,則創(chuàng)建一個(gè)新線(xiàn)程并添加到池中。終止并從緩存中移除那些已有 60 秒鐘未被使用的線(xiàn)程。public static ExecutorService newSingleThreadExecutor() 創(chuàng)建一個(gè)單線(xiàn)程化的Executor。public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 平鄉(xiāng)垃圾分選管理辦法
- 科技項(xiàng)目專(zhuān)家管理辦法
- 肺仟維化中醫(yī)課件
- 口腔護(hù)士種植培訓(xùn)課件
- 鞏義二模初三數(shù)學(xué)試卷
- 高中二檢數(shù)學(xué)試卷
- 定遠(yuǎn)初二數(shù)學(xué)試卷
- 廣東甘肅高考數(shù)學(xué)試卷
- 高2期中數(shù)學(xué)試卷
- 幼師課件制作培訓(xùn)體會(huì)
- 數(shù)字資產(chǎn)監(jiān)管框架優(yōu)化
- 醫(yī)患之間暴力行為預(yù)防與處理管理制度
- 2022年版初中物理課程標(biāo)準(zhǔn)解讀-課件
- MOOC 大學(xué)物理實(shí)驗(yàn)-鄭州大學(xué) 中國(guó)大學(xué)慕課答案
- 眼科臨床路徑培訓(xùn)記錄課件
- 術(shù)后病人燙傷不良事件PDCA循環(huán)分析課件
- 學(xué)校作業(yè)檢查總結(jié)匯報(bào)
- 骨科手術(shù)后的康復(fù)輔助器具和輔助裝置
- 學(xué)校課程體系建設(shè)與調(diào)整情況匯報(bào)
- 鐵路路基施工與維護(hù)習(xí)題集
- 音樂(lè)考試真題
評(píng)論
0/150
提交評(píng)論