談?wù)? Callable 贸街、 Future 庵寞、 Runnable 它們之間的淵源
Runnable 存在的缺陷
不能在任務(wù)執(zhí)行完成后返回執(zhí)行結(jié)果。
-
不能拋出檢查類異常薛匪,必須在run 方法中聲明 try catch 捕捉異常捐川。
* @see java.lang.Thread#run() */ public abstract void run();
Callable 和 Runnable 的不同
-
執(zhí)行線程任務(wù)請求的方法不同,callable 請求的是 call() 方法逸尖, runnable 請求的是run () 方法古沥。
*/ public abstract void run(); */ V call() throws Exception;
從call() 方法的源碼中也可以看出 ,Callable 的任務(wù)執(zhí)行之后是有 泛型的V 返回值的, 而 **Runnable 任務(wù) run() 的方法簽名 是void ** 沒有返回值娇跟。
call() 方法簽名中聲明了可以拋出異常岩齿,run() 方法并未聲明,因而不能拋出異常苞俘。
Future 的作用是什么盹沈?
在執(zhí)行大型計算任務(wù)的時候,為了不因繁重的計算任務(wù)而長時間阻塞主線程的任務(wù)執(zhí)行吃谣,可以把計算任務(wù)放到子線程去執(zhí)行乞封,并通過 Future 去控制子線程的執(zhí)行過程,獲取計算結(jié)果岗憋,從而提高整體任務(wù)的執(zhí)行效率肃晚。(是異步任務(wù)執(zhí)行的思想)
Callable 和 Future 的關(guān)系
- Future 可以在執(zhí)行Callable 任務(wù)之后,存儲 call() 方法執(zhí)行結(jié)果澜驮,并可通過 Future 的get() 方法獲取執(zhí)行的結(jié)果陷揪。
- 可以通過 Future 的 isDone() 方法, 來檢測任務(wù)的執(zhí)行情況杂穷。
- 可以通過 cancel() 方法悍缠,按照業(yè)務(wù)需求,比如耗時較長而超過了一定時間閾值取消任務(wù)的執(zhí)行耐量。
future 的主要方法
- boolean cancel(boolean mayInterruptIfRunning);
- boolean isCancelled();
- boolean isDone();
- V get() throws InterruptedException, ExecutionExcept
- V get(long timeout, TimeUnit unit)throws InterruptedException, ExecutionException, TimeoutException;(推薦使用飞蚓,避免程序阻塞)
get() 方法獲取任務(wù)執(zhí)行結(jié)果
執(zhí)行可能出現(xiàn)的幾種場景
基礎(chǔ)復(fù)盤-Future .jpg
isDone() 方法 檢測任務(wù)是否執(zhí)行完成
- true: 標(biāo)識任務(wù)執(zhí)行成功, 出現(xiàn)異常的情況依然標(biāo)識任務(wù)已經(jīng)執(zhí)行成功。
- false: 標(biāo)識任務(wù)還未執(zhí)行完成廊蜒。
cancel() 方法 取消任務(wù)執(zhí)行
- 任務(wù)還未開始執(zhí)行趴拧,調(diào)用cancel 方法溅漾,任務(wù)會被正常取消, cancel() 方法執(zhí)行返回true著榴。
- 任務(wù)已經(jīng)被 取消或則已完成添履,調(diào)用cancel() 方法,返回false脑又。
- 任務(wù)正在執(zhí)行情況下暮胧,調(diào)用了cancel() 方法,不會直接取消任務(wù)的執(zhí)行问麸, 會根據(jù) mayInterruptIfRunning 參數(shù)決定是否讓當(dāng)前正在執(zhí)行任務(wù)的線程響應(yīng)中斷信號往衷, 如果為true ,那么正在執(zhí)行任務(wù)的線程會收到一個中斷信號,處理中斷邏輯严卖,false 則表示不中斷當(dāng)前任務(wù)的執(zhí)行席舍, cancel 方法返回 false。
Future 產(chǎn)生新的線程了嗎哮笆?
Callable 和 Future 并不能產(chǎn)生新的線程来颤, 需要借助 Thread 或者線程池(ThreadPool) 才能執(zhí)行任務(wù)。