1. submit任務,等待線程池execute;
2. 執行FutureTask類的get方法時,會把主線程封裝成WaitNode節點并保存在waiters鏈表中, 并阻塞等待運行結果;
3. FutureTask任務執行完成后,通過UNSAFE設置waiters相應的waitNode為null,并通過LockSupport類unpark方法喚醒主線程。
在實際業務場景中,Future和Callable基本是成對出現的,Callable負責產生結果,Future負責獲取結果。
1. Callable接口類似于Runnable,只是Runnable沒有返回值;
2. Callable任務除了返回正常結果之外,如果發生異常,該異常也會被返回,即Future可以拿到異步執行任務各種結果;
3. Future.get方法會導致主線程阻塞,直到Callable任務執行完成。