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