run方法是Thread內部類中一個重寫的方法沒有參數傳入,也沒有返回值。如果想在實現run方法時傳參有三種方法:
- 構造函數傳參
- 成員變量傳參
- 回調函數傳參
瞭解瞭如何在run方法內進行傳參之後,那麼要如何實現處理線程的返回值呢?
實現處理線程的返回值一共有三種方法:
1、主線程等待法
使主線程循環等待直到目標子線程返回值爲止;
下面是一個簡單的demo:
使用主線程等待法之後就能獲取到子線程的返回值:
缺點在於如果存在很多的子線程並且等待的時間也不確定的話就會產生很大的未知問題。
2、使用Thread類的join()阻塞當前的線程以等待子線程處理完畢
簡單來講就是使用join替換掉之前的子線程去等待主線程:
但是join還是存在缺點就是粒度不夠細,沒有辦法精準的進行操作線程運行時間的判斷。
3、通過Callable接口實現:通過FutureTask或線程池實現
使用線程時候一般情況下都是沒有返回值的,JDK5之前是這樣的,Callable這個接口就可以收到線程的返回值。
一個實體類實現Callable接口:
在兩句輸出語句之間,返回value的值,獲取value值的方法有兩種:
- FutureTask
輸出結果爲:
- 使用線程池方法來獲取子線程的返回值
線程池的原理比較簡單是啓用了很多線程去等待接收返回值。