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