多執行緒的幾種實現方式

2021-10-01 13:04:09 字數 2796 閱讀 9659

前面兩種可以歸結為一類:無返回值,原因很簡單,通過重寫run方法,run方式的返回值是void,所以沒有辦法返回結果

後面兩種可以歸結成一類:有返回值,通過callable介面,就要實現call方法,這個方法的返回值是object,所以返回的結果可以放在object物件中

方式1:繼承thread類的執行緒實現方式如下:

public class threaddemo01 extends thread

public void

run(

) public static

void

main

(string[

] args)

}

程式結果:

thread[main,5,main]

我是自定義的執行緒1

執行緒實現方式2:通過實現runnable介面,實現run方法,介面的實現類的例項作為thread的target作為引數傳入帶參的thread建構函式,通過呼叫start()方法啟動執行緒

public class threaddemo02 } 

class mythread implements runnable

}

程式執行結果:

main

thread-0–>我是通過實現介面的執行緒實現方式!

執行緒實現方式3:通過callable和futuretask建立執行緒

a:建立callable介面的實現類 ,並實現call方法

b:建立callable實現類的實現,使用futuretask類包裝callable物件,該futuretask物件封裝了callable物件的call方法的返回值

c:使用futuretask物件作為thread物件的target建立並啟動執行緒

d:呼叫futuretask物件的get()來獲取子執行緒執行結束的返回值

public class threaddemo03 } 

class tickets implements callable

}

程式執行結果:

main

thread-0–>我是通過實現callable介面通過futuretask包裝器來實現的執行緒

執行緒實現方式4:通過執行緒池建立執行緒

public class threaddemo05

//關閉執行緒池

executorservice.

shutdown()

;}}

class runnablethread implements runnable

}

程式執行結果:

通過執行緒池方式建立的執行緒:pool-1-thread-3

通過執行緒池方式建立的執行緒:pool-1-thread-4

通過執行緒池方式建立的執行緒:pool-1-thread-1

通過執行緒池方式建立的執行緒:pool-1-thread-5

通過執行緒池方式建立的執行緒:pool-1-thread-2

通過執行緒池方式建立的執行緒:pool-1-thread-5

通過執行緒池方式建立的執行緒:pool-1-thread-1

通過執行緒池方式建立的執行緒:pool-1-thread-4

通過執行緒池方式建立的執行緒:pool-1-thread-3

通過執行緒池方式建立的執行緒:pool-1-thread-2

executorservice、callable都是屬於executor框架。返回結果的執行緒是在jdk1.5中引入的新特徵,還有future介面也是屬於這個框架,有了這種特徵得到返回值就很方便了。

通過分析可以知道,他同樣也是實現了callable介面,實現了call方法,所以有返回值。這也就是正好符合了前面所說的兩種分類

執行callable任務後,可以獲取乙個future的物件,在該物件上呼叫get就可以獲取到callable任務返回的object了。get方法是阻塞的,即:執行緒無返回結果,get方法會一直等待。

再介紹executors類:提供了一系列工廠方法用於建立執行緒池,返回的執行緒池都實現了executorservice介面。

public static executorservice newfixedthreadpool(int nthreads)

建立固定數目執行緒的執行緒池。

public static executorservice newcachedthreadpool()

建立乙個可快取的執行緒池,呼叫execute 將重用以前構造的執行緒(如果執行緒可用)。如果現有執行緒沒有可用的,則建立乙個新執行緒並新增到池中。終止並從快取中移除那些已有 60 秒鐘未被使用的執行緒。

public static executorservice newsinglethreadexecutor()

建立乙個單執行緒化的executor。

public static scheduledexecutorservice newscheduledthreadpool(int

corepoolsize)

建立乙個支援定時及週期性的任務執行的執行緒池,多數情況下可用來替代timer類。

executoreservice提供了submit()方法,傳遞乙個callable,或runnable,返回future。如果executor後台執行緒池還沒有完成callable的計算,這呼叫返回future物件的get()方法,會阻塞直到計算完成。

引用阿里的關於 執行緒的建議:

執行緒池不允許使用executors去建立,而是通過threadpoolexecutor的方式;

這樣的處理方式讓寫的同學們更加明確執行緒池的執行規則,規避資源耗盡的風險

多執行緒 實現多執行緒的幾種方式

public class mythread extends thread mythread mythread1 newmythread mythread mythread2 newmythread mythread1.start mythread2.start public class mythre...

多執行緒實現的幾種方式

public static void main string args thread1 start public class calandfuture catch interruptedexception e class mytask implements callable 通過執行緒池建立執行緒 ...

java多執行緒都有幾種方式實現

有三種 1 繼承thread類,重寫run函式 建立 class xx extends thread 開啟執行緒 物件.start 啟動執行緒,run函式執行 2 實現runnable介面,重寫run函式 開啟執行緒 thread t new thread 物件 建立執行緒物件 t.start 3 ...