# Future
Future表示一個任務的生命周期,并提供方法判斷是否已經完成或取消,以及獲取任務的結果和取消任務等;
Future是J.U.C中的一個接口,它代表著一個異步執行結果。
Future可以看成線程在執行時留給調用者的一個存根,通過這個存在可以進行查看線程執行狀態\(isDone\)、取消執行\(cancel\)、阻塞等待執行完成并返回結果\(get\)、異步執行回調函數\(callback\)等操作
```
public interface Future<V> {
/** 取消,mayInterruptIfRunning-false:不允許在線程運行時中斷 **/
boolean cancel(boolean mayInterruptIfRunning);
/** 是否取消**/
boolean isCancelled();
/** 是否完成 **/
boolean isDone();
/** 同步獲取結果 **/
V get() throws InterruptedException, ExecutionException;
/** 同步獲取結果,響應超時 **/
V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
}
```
Future的cancel方法可以取消任務的執行,它有一布爾參數,參數為true表示立即中斷任務的執行,參數為false表示允許正在運行的任務運行完成
### get方法
get方法的行為取決于任務的狀態\(尚未開始、正在運行、已完成\);
* 如果任務已完成,那么get會立即返回或拋出一個Exception;
* 如果任務沒有完成,那么get將阻塞并直到任務完成;
* 如果任務拋出了異常那么get將該異常封裝為ExecutionException并重新拋出;
* 如果任務被取消那么get將拋出CancellationException;
如果get拋出了ExecutionExecption那么可以通過getCause獲得被封裝的初始異常;
### Future模式核心思想
> Future模式的核心在于:去除了主函數的等待時間,并使得原本需要等待的時間段可以用于處理其他業務邏輯(根據《Java程序性能優化》)
Future模式有點類似于商品訂單。在網上購物時,提交訂單后,在收貨的這段時間里無需一直在家里等候,可以先干別的事情。類推到程序設計中時,當提交請求時,期望得到答復時,如果這個答復可能很慢。傳統的時一直等待到這個答復收到時再去做別的事情,但如果利用Future設計模式就無需等待答復的到來,在等待答復的過程中可以干其他事情
### Future模式的JDK內置實現
由于Future是非常常用的多線程設計模式,因此在JDK中內置了Future模式的實現。這些類在java.util.concurrent包里面。其中最為重要的是FutureTask類,它實現了Runnable接口,作為單獨的線程運行。在其run\(\)方法中,通過Sync內部類調用Callable接口,并維護Callable接口的返回對象。當使用FutureTask.get\(\)方法時,將返回Callable接口的返回對象
```
import java.util.concurrent.Callable;
public class RealData implements Callable<String> {
protected String data;
public RealData(String data) {
this.data = data;
}
@Override
public String call() throws Exception {
//利用sleep方法來表示真是業務是非常緩慢的
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return data;
}
}
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
public class Application {
public static void main(String[] args) throws Exception {
FutureTask<String> futureTask =
new FutureTask<String>(new RealData("name"));
ExecutorService executor =
Executors.newFixedThreadPool(1); //使用線程池
//執行FutureTask,相當于上例中的client.request("name")發送請求
executor.submit(futureTask);
//這里可以用一個sleep代替對其他業務邏輯的處理
//在處理這些業務邏輯過程中,RealData也正在創建,從而充分了利用等待時間
Thread.sleep(2000);
//使用真實數據
//如果call()沒有執行完成依然會等待
System.out.println("數據=" + futureTask.get());
}
}
```
### 創建Future
1. ExecutorService的submit方法返回一個future;
2. 顯示創建FutureTask;
3. 調用AbstractExecutorService的newTaskFor方法創建一個future(本質上這種方式也是創建了一個FutureTask);
- 簡介
- 概述
- 進程vs線程
- 資源限制
- 有關并行的兩個定律
- 線程同步和阻塞
- 線程阻塞
- 線程的特性
- 守護線程
- 線程異常
- Thread
- 線程狀態
- 線程中斷
- wait¬ify
- suspend&resume
- join&yield
- notify¬ifyAll
- Thread.sleep
- 線程任務
- Runnable
- Callable
- Future模式
- FutureTask
- 線程實現方式
- 內核線程實現
- 用戶線程實現
- 混合實現
- Java線程的實現
- java與協程
- 纖程-Fiber
- 線程調度
- 多線程協作方式
- 阻塞
- 放棄
- 休眠
- 連接線程
- 線程估算公式
- 線程活躍性
- 死鎖
- 線程安全性
- 對象的發布與逸出
- 構造方法溢出
- 線程封閉
- 對象的可變性
- 原子性
- 原子操作
- CPU原子操作原理
- 總線鎖
- 緩存鎖
- JAVA如何實現原子操作
- long和double讀寫操作原子性
- Adder和Accumulator
- 線程性能
- 同步工具類
- 閉鎖
- CountDownLatch
- FutureTask
- 信號量
- 柵欄
- CyclicBarrier
- Exchanger
- 并發編程
- volatile
- synchronized
- 無鎖
- 偏向鎖
- 輕量級鎖
- 鎖的優缺點對比
- 鎖升級
- 鎖消除
- Monitor
- synchronized語法
- Mutex Lock
- synchronized實踐問題
- synchronized&ReentrantLock
- Lock
- ReentrantLock
- Condition
- 讀寫鎖
- ReadWriteLock
- StampedLock
- 線程池
- Executor
- ExecutorService
- Executors
- ThreadPoolExecutor
- RejectedExecutionHandler
- ThreadFactory
- 線程池大小公式
- 動態調整線程池大小
- Fork/Join框架
- ForkJoinPool
- CompletableFuture
- JUC并發工具包
- LockSupport
- 延時任務與周期任務
- Timer
- TimerTask
- 異構任務并行化
- CompletionService
- volatile和synchronized比較
- 鎖優化
- 鎖相關概念
- 悲觀鎖(排它鎖)
- 樂觀鎖
- 自旋鎖
- 樂觀鎖vs悲觀鎖
- JVM鎖優化-鎖消除
- ThreadLocal
- InheritableThreadLocal
- TransmittableThreadLocal
- ThreadLocalRandom
- 無鎖
- AtomicInteger
- Unsafe
- AtomicReference
- AtomicStampedReference
- AtomicIntegerArray
- AtomicIntegerFieldUpdater
- 無鎖Vector
- LongAdder
- LongAccumulator
- 常見鎖類型
- 悲觀鎖&獨占鎖
- 樂觀鎖
- 樂觀鎖vs悲觀鎖
- 自旋鎖vs適應性自旋鎖
- 公平鎖vs非公平鎖
- 可重入鎖vs非可重入鎖
- 獨享鎖vs共享鎖
- 互斥鎖
- CAS
- AQS介紹
- AQS深入剖析
- AQS框架
- AQS核心思想
- AQS數據結構
- 同步狀態State
- ReentrantLock vs AQS
- AQS與ReentrantLock的關聯
- ReentrantLock具體實現
- 線程加入等待隊列
- 等待隊列中線程出隊列時機
- 如何解鎖
- 中斷恢復后的執行流程
- ReentrantLock的可重入應用
- JUC中的應用場景
- 自定義同步工具
- CLH鎖
- 并發框架
- Akka
- Disruptor-無鎖緩存框架
- 常見面試題
- 兩個線程交替打印A和B
- 附錄