剛把Thread 的知識理了一遍,
Runnable是一個介面,而Thread是Runnable的一個實作類,
所以也就有了之前創建執行緒的兩種方法
- 繼承Thread
- 實作Runnable
我們看一下新建執行緒的方法:

都是得傳入一個Runnable物件(這句話很關鍵)
所以傳入一個Runnble和Thread物件都行,
現在引入創建執行緒的第三種方法:Callable
為了實作 Runnable,需要實作不回傳任何內容的 run()方法,而對于
Callable,需要實作在完成時回傳結果的 call()方法,
? call()方法可以引發例外,而 run()則不能,
Callable最大的特點就是 它能回傳數值,并拋出例外,而且它不是run()方法,而是call()方法,
但是Callable最大的問題就是不能丟人Thread類中直接創建,因為Thread只認識Runnable,所以我們必須找到Callable和Runnable之間的橋梁,

也就是找一個類,即和Runnable友關系,又和Callable有關系,
這個類就是FutureTask了,
- Runnable介面有實作類FutureTask
- FutureTask構造可以傳遞Callable
所以創建也給Callable可以這樣
新類 MyThread2 實作 callable 介面
class MyThread2 implements Callable<Integer>{
@Override
public Integer call() throws Exception {
return 200;
}
- 新建一個callable物件
Callable callable = new MyThread2()
- 傳入callable物件,并新建一個futuretask物件,
FutureTask futureTask2 = new FutureTask(callable)
也可以之間通過lam運算式(函式式介面)實作

- 新建一個執行緒,傳入FutureTask物件
new Thread(futureTask2, “執行緒二”).start()
這就是基本步驟,
接下來可以來擴展地講講 futuretask的作用
Future物件
Future 介面
當 call()方法完成時,結果必須存盤在主執行緒已知的物件中,以便主執行緒可
以知道該執行緒回傳的結果,為此,可以使用 Future 物件,
將 Future 視為保存結果的物件–它可能暫時不保存結果,但將來會保存(一旦
Callable 回傳),Future 基本上是主執行緒可以跟蹤進度以及其他執行緒的結果的
一種方式,要實作此介面,必須重寫 5 種方法,這里列出了重要的方法,如下:
? public boolean cancel(boolean mayInterrupt):用于停止任務,
如果尚未啟動,它將停止任務,如果已啟動,則僅在 mayInterrupt 為 true
時才會中斷任務,
? public Object get()拋出 InterruptedException,ExecutionException:
用于獲取任務的結果,
如果任務完成,它將立即回傳結果,否則將等待任務完成,然后回傳結果,
? public boolean isDone():如果任務完成,則回傳 true,否則回傳 false
可以看到 Callable 和 Future 做兩件事-Callable 與 Runnable 類似,因為它封
裝了要在另一個執行緒上運行的任務,而 Future 用于存盤從另一個執行緒獲得的結
果,實際上,future 也可以與 Runnable 一起使用,
要創建執行緒,需要 Runnable,為了獲得結果,需要 future,
FutureTask
Java 庫具有具體的 FutureTask 型別,該型別實作 Runnable 和 Future,并方
便地將兩種功能組合在一起, 可以通過為其建構式提供 Callable 來創建
FutureTask,然后,將 FutureTask 物件提供給 Thread 的建構式以創建
Thread 物件,因此,間接地使用 Callable 創建執行緒,
核心原理:(重點)
在主執行緒中需要執行比較耗時的操作時,但又不想阻塞主執行緒時,可以把這些
作業交給 Future 物件在后臺完成
? 當主執行緒將來需要時,就可以通過 Future 物件獲得后臺作業的計算結果或者執
行狀態
? 一般 FutureTask 多用于耗時的計算,主執行緒可以在完成自己的任務后,再去
獲取結果,
? 僅在計算完成時才能檢索結果;如果計算尚未完成,則阻塞 get 方法
? 一旦計算完成,就不能再重新開始或取消計算
? get 方法而獲取結果只有在計算完成時獲取,否則會一直阻塞直到任務轉入完
成狀態,然后會回傳結果或者拋出例外
? get 只計算一次,因此 get 方法放到最后
舉個例子吧,
比如現在老師在上課,但是他渴了,他想買水,但是還得繼續上課,
這時就可以單獨開啟一條執行緒,讓班長去幫他買水,(開啟單獨一條執行緒,不影響主執行緒的運行)


get方法可以得到return的值

isDone()方法可以判斷是否完成了,


第一次會計算,第二次(之前計算過的),就直接回傳結果了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/290476.html
標籤:其他
上一篇:IOS-Tom貓小游戲實作
下一篇:Unity 實戰專案 ??| Unity接入 百度語音識別 SDK!一篇文章搞定在Unity中實作語音識別!(萬字完整教程)
