Java 實現線程的方式有幾種方式?帶有返回值的線程怎麼實現?

Java 實現線程的方式有幾種方式?帶有返回值的線程怎麼實現?


在Java線程開發中,有幾種方法開啟線程?假如需要得到線程返回的信息怎麼辦?可以實現嗎?凱哥將通過源碼和大家一起分享下線程怎麼將返回值帶回來的。


一:無返回值類型的


1:繼承Thread類


2:實現Runnable接口


這兩種是大家常用的,代碼demo就截圖吧。


1:繼承Thread類的寫法


定義:一個類型需要extends thread類,然後實現thread類的run方法。

Java 實現線程的方式有幾種方式?帶有返回值的線程怎麼實現?



2:實現Runnable接口的寫法:


定義一個類,實現Runable接口,重新run方法。


New個thread對象,使用有參構造器,參數是runnable的。然後thread.start()


Java 實現線程的方式有幾種方式?帶有返回值的線程怎麼實現?


二:帶有返回值的


3:實現Callable接口


操作步驟:


一個類實現Callable接口,重新call方法;


在調用的時候,需要使用FutureTask這個類的有參構造,然後再使用thread的有參構造。


最後調用task的get方法。


代碼如下:


Java 實現線程的方式有幾種方式?帶有返回值的線程怎麼實現?


運行結果:


Java 實現線程的方式有幾種方式?帶有返回值的線程怎麼實現?



Callable返回值的源碼:


我們從FutureTask這個類入手,因為返回值就是從FutureTask中獲取的。來看看類關係圖:


Java 實現線程的方式有幾種方式?帶有返回值的線程怎麼實現?



FutureTask實現了RunnableFuture接口,RunnableFuture接口繼承了Future和Runnable接口。


Java 實現線程的方式有幾種方式?帶有返回值的線程怎麼實現?



Java 實現線程的方式有幾種方式?帶有返回值的線程怎麼實現?



我們看RunnableFuture這個接口的時候,發現只有一個無返回值的run方法。那麼,線程返回的數據是哪個類實現的呢?其實就在FutureTask類裡面。我們在來看看FuntrueTask這個類:


Java 實現線程的方式有幾種方式?帶有返回值的線程怎麼實現?



重新了run方法。最後,有個set result。既然有set方法。再來看看demo中task.get()方法:


Java 實現線程的方式有幾種方式?帶有返回值的線程怎麼實現?



Get方法就帶有返回值的。


至此,實現callable接口帶有返回值的原因已經找到了。


4:使用線程池創建線程


使用線程池創建的線程,可以有返回值,也可以沒有返回值。使用Executory這個頂級接口來處理。


我們先來看看Executor接口的關係。如下圖:


Java 實現線程的方式有幾種方式?帶有返回值的線程怎麼實現?



其中看到了熟悉的ThreadPoolExecutor和ScheduledThreadPoolExecutor


4.1:使用Executor創建沒有返回值的線程:


Java 實現線程的方式有幾種方式?帶有返回值的線程怎麼實現?



說明:這裡不帶返回值的,其實就是調用了Runnable的run方法。


4.2:帶有返回值的demo


創建一個類,實現Callable接口。如下圖:


Java 實現線程的方式有幾種方式?帶有返回值的線程怎麼實現?



通過這個接口,我們知道是有返回值的。


Java 實現線程的方式有幾種方式?帶有返回值的線程怎麼實現?



三:總結


Java中實現線程有4種方式:


我們最熟悉的不帶換回值的兩種以及帶有返回值的兩種。分別是:


Thread、Runnable和Callable以及線程池


分享到:


相關文章: