本篇文章給大家?guī)?lái)了關(guān)于java的相關(guān)知識(shí),其中主要總結(jié)介紹了創(chuàng)建多線程的五種方法,包括了繼承Thread類(lèi)、實(shí)現(xiàn)Runnable接口、實(shí)現(xiàn)Callable接口、繼承TimerTask類(lèi)和通過(guò)線程池啟動(dòng)多線程,希望對(duì)大家有幫助。
推薦學(xué)習(xí):《java學(xué)習(xí)教程》
Java創(chuàng)建多線程的五種方法
- 僅作為Java編程的交流和學(xué)習(xí),如有問(wèn)題還望不吝賜教。歡迎補(bǔ)充和交流,轉(zhuǎn)載請(qǐng)注明!
(一)繼承Thread類(lèi)
1.實(shí)現(xiàn)描述
- 通過(guò)繼承Thread并且重寫(xiě)其run( ),run方法中定義需要執(zhí)行的任務(wù)。創(chuàng)建后的子類(lèi)通過(guò)調(diào)用start( )方法即可執(zhí)行線程方法。
- 通過(guò)繼承Thread實(shí)現(xiàn)的線程類(lèi),多個(gè)線程間無(wú)法共享線程類(lèi)的實(shí)例變量。需要?jiǎng)?chuàng)建不同Thread對(duì)象,自然不共享資源。
2.具體步驟
1)定義UserThread類(lèi),繼承Thread類(lèi)
2)重寫(xiě)run( )方法
3)創(chuàng)建UserThread對(duì)象
4)調(diào)用start( )方法
3.代碼實(shí)現(xiàn)
4.注意事項(xiàng)
- 數(shù)據(jù)資源不共享,多個(gè)線程分別完成自己的任務(wù)。比如三個(gè)售票窗口同時(shí)售票,各自賣(mài)各自的票,會(huì)出現(xiàn)三個(gè)售票窗口出售同一張票的問(wèn)題。
(二)實(shí)現(xiàn)Runnable接口
1.實(shí)現(xiàn)描述
- 需要先定義一個(gè)類(lèi)實(shí)現(xiàn)Runnable接口并重寫(xiě)該接口的run( )方法,此run方法是線程執(zhí)行體。接著創(chuàng)建 Runnable實(shí)現(xiàn)類(lèi)的對(duì)象,作為創(chuàng)建Thread對(duì)象的參數(shù)target,此Thread對(duì)象才是真正的線程對(duì)象。
- 利用實(shí)現(xiàn)Runnable接口的線程類(lèi)創(chuàng)建對(duì)象,可以實(shí)現(xiàn)線程之間的資源共享。
2.具體步驟
1)定義一個(gè)UserRun類(lèi),實(shí)現(xiàn)Runnble接口
2)重寫(xiě)run( )方法
3)創(chuàng)建UserRun類(lèi)的對(duì)象
4)創(chuàng)建Thread類(lèi)的對(duì)象,UserRun類(lèi)的對(duì)象作為T(mén)hread類(lèi)構(gòu)造方法的參數(shù)
5)啟動(dòng)線程
3.代碼實(shí)現(xiàn)
4.注意事項(xiàng)
- 數(shù)據(jù)資源共享,多個(gè)線程共同完成一個(gè)任務(wù)(多個(gè)線程共享了創(chuàng)建線程對(duì)象的資源)。比如三個(gè)售票窗口(三個(gè)線程)同時(shí)售票(MyThread類(lèi)中的ticket),三個(gè)線程共同使用資源。
(三)實(shí)現(xiàn)Callable接口
1.實(shí)現(xiàn)描述
- Callable接口如同Runable接口的升級(jí)版,其提供的call( )方法將作為線程的執(zhí)行體,同時(shí)允許有返回值。
- Callable對(duì)象不能直接作為T(mén)hread對(duì)象的target,因?yàn)镃allable接口是 Java5 新增的接口,不是Runnable接口的子接口。
- 對(duì)于這個(gè)問(wèn)題的解決方案,就引入 Future接口,此接口可以接受call( )的返回值,RunnableFuture接口是Future接口和Runnable接口的子接口,可以作為T(mén)hread對(duì)象的target。
2.具體步驟
1)定義類(lèi)UserCallable,實(shí)現(xiàn)Callable接口
2)重寫(xiě)call( )方法
3)創(chuàng)建UserCallable的對(duì)象
4)創(chuàng)建RunnableFuture接口的子類(lèi)FutureTask的對(duì)象,構(gòu)造函數(shù)的參數(shù)是UserCallable的對(duì)象
5)創(chuàng)建Thread類(lèi)的對(duì)象,構(gòu)造函數(shù)的參數(shù)是FutureTask的對(duì)象
6)啟動(dòng)線程
3.代碼實(shí)現(xiàn)
4.注意事項(xiàng)
- 數(shù)據(jù)資源共享,多個(gè)線程共同完成一個(gè)任務(wù)(多個(gè)線程共享了創(chuàng)建線程對(duì)象的資源)。比如三個(gè)售票窗口(三個(gè)線程)同時(shí)售票(MyThread類(lèi)中的ticket),三個(gè)線程共同使用資源。同時(shí),線程調(diào)用完畢后還會(huì)帶有返回值。
(四)繼承TimerTask類(lèi)
1.實(shí)現(xiàn)描述
- 定時(shí)器類(lèi)Timer和TimerTask可以做為實(shí)現(xiàn)線程的另一種方式。
- Timer是一種線程設(shè)施,用于安排以后在后臺(tái)線程中執(zhí)行的任務(wù)??砂才湃蝿?wù)執(zhí)行一次,或者定期重復(fù)執(zhí)行,可以看成一個(gè)定時(shí)器,可以調(diào)度TimerTask。
- TimerTask是一個(gè)抽象類(lèi),實(shí)現(xiàn)了Runnable接口,所以具備了多線程的能力。
2.具體步驟
1)定義類(lèi)UserTimerTask,繼承抽象類(lèi)TimerTask
2)創(chuàng)建UserTask類(lèi)的對(duì)象
3)創(chuàng)建Timer類(lèi)的對(duì)象,設(shè)置任務(wù)的執(zhí)行策略
3.代碼實(shí)現(xiàn)
4.注意事項(xiàng)
- 定時(shí)器類(lèi)創(chuàng)建線程