1、實(shí)現(xiàn)Runnable接口創(chuàng)建線程
由于Java是單繼承機(jī)制,如果自己的類已經(jīng)繼承自另一個(gè)類,則無(wú)法再直接繼承Thread類,此時(shí),可以通過實(shí)現(xiàn)Runnable接口來(lái)實(shí)現(xiàn)多線程。
實(shí)現(xiàn)Runnable接口并實(shí)現(xiàn)其中的run方法,然后通過構(gòu)造Thread實(shí)例,傳入Runnable實(shí)現(xiàn)類,然后調(diào)用Thread的start方法即可開啟一個(gè)新線程。
2、繼承Thread類創(chuàng)建線程
Thread類本質(zhì)上也是實(shí)現(xiàn)了Runnable接口的一個(gè)實(shí)例,代表一個(gè)線程的實(shí)例。啟動(dòng)線程的唯一方法就是通過Thread類的start()實(shí)例方法。
start()方法是一個(gè)native方法,它將啟動(dòng)一個(gè)新線程,并執(zhí)行run()方法。這種方式實(shí)現(xiàn)多線程比較簡(jiǎn)單,通過繼承Thread類并復(fù)寫run()方法,就可以啟動(dòng)新線程并執(zhí)行自己定義的run()方法。
3、使用ExecutorService、Callable、Future實(shí)現(xiàn)有返回結(jié)果的線程(線程池方式)
ExecutorService、Callable、Future三個(gè)接口都是屬于Executor框架??煞祷刂档娜蝿?wù)必須實(shí)現(xiàn)Callable接口。通過ExecutorService執(zhí)行Callable任務(wù)后,可以獲取到一個(gè)Future的對(duì)象,在該對(duì)象上調(diào)用get()就可以獲取到Callable任務(wù)返回的結(jié)果了。
4、實(shí)現(xiàn)Callable接口通過FutureTask包裝器來(lái)創(chuàng)建Thread線程
首先需要一個(gè)實(shí)現(xiàn)Callable接口的實(shí)例,然后實(shí)現(xiàn)該接口的唯一方法call邏輯,接著把Callable實(shí)例包裝成FutureTask傳遞給Thread實(shí)例啟動(dòng)新線程。
FutureTask本質(zhì)上也實(shí)現(xiàn)了Runnable接口,所以同樣可以用來(lái)構(gòu)造Thread實(shí)例。
以上就是四種實(shí)現(xiàn)java多線程方式介紹的內(nèi)容。