future.get方法阻塞問題的解決,實現按照任務完成的先后順序獲取任務的結果


1、Future

Future模式是多線程設計常用的一種設計模式。Future模式可以理解成:我有一個任務,提交給了Future,Future替我完成這個任務。期間我自己可以去做任何想做的事情。一段時間之后,我就便可以從Future那兒取出結果。
Future提供了三種功能:
判斷任務是否完成
能夠中斷任務
能夠獲取任務執行的結果
向線程池中提交任務的submit方法不是阻塞方法,而Future.get方法是一個阻塞方法,當submit提交多個任務時,只有所有任務都完成后,才能使用get按照任務的提交順序得到返回結果,所以一般需要使用future.isDone先判斷任務是否全部執行完成,完成后再使用future.get得到結果。(也可以用get (long timeout, TimeUnit unit)方法可以設置超時時間,防止無限時間的等待)
三段式的編程:1.啟動多線程任務2.處理其他事3.收集多線程任務結果,Future雖然可以實現獲取異步執行結果的需求,但是它沒有提供通知的機制,要么使用阻塞,在future.get()的地方等待future返回的結果,這時又變成同步操作;要么使用isDone()輪詢地判斷Future是否完成,這樣會耗費CPU的資源。
解決方法:CompletionService和CompletableFuture(按照任務完成的先后順序獲取任務的結果)

阻塞調用是指調用結果返回之前,當前線程會被掛起。調用線程只有在得到結果之后才會返回。
非阻塞調用指在不能立刻得到結果之前,該調用不會阻塞當前線程

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM