CompletionService接口
CompletionService相當於一個執行任務的服務,通過submit丟任務給這個服務,服務內部去執行任務,可以通過服務提供的一些方法獲取服務中已經完成的任務.
- Future submit(Callable task);
- Future submit(Runnable task, V result);
- Future take() throws InterruptedException;
從服務中返回並移除一個已經完成的任務,如果獲取不到,會一致阻塞到有返回值爲止。此方法會響應線程中斷。
- Future poll();
從服務中返回並移除一個已經完成的任務,如果內部沒有已經完成的任務,則返回空,此方法會立即響應。
- Future poll(long timeout, TimeUnit unit) throws InterruptedException;
ExecutorCompletionService類
ExecutorCompletionService類是CompletionService接口的具體實現
說一下其內部原理,ExecutorCompletionService創建的時候會傳入一個線程池,調用submit方法傳入需要執行的任務,任務由內部的線程池來處理;ExecutorCompletionService內部有個阻塞隊列,任意一個任務完成之後,會將任務的執行結果(Future類型)放入阻塞隊列中,然後其他線程可以調用它take、poll方法從這個阻塞隊列中獲取一個已經完成的任務,獲取任務返回結果的順序和任務執行完成的先後順序一致,所以最先完成的任務會先返回。