下面的示例代碼我正在注入一個biconsumer
睡眠100毫米作爲一套完整的未來的完成行動。我已經使用whenCompleteAsync
方法,通過單獨使用executorService
。 executorService
是ThreadPoolExecutor
與芯池大小5,最大尺寸和5 1.如何捕獲CompletableFuture的whenCompleteAsync調用中拋出的RejectedExecutionException?
public class CompleteTest {
public static void main(String[] args) {
ExecutorService executorService = new ThreadPoolExecutor(5, 5, 10,
TimeUnit.SECONDS, new ArrayBlockingQueue<>(1));
ArrayList<CompletableFuture<String>> list = new ArrayList<>();
for (int i = 0; i <100; i++) {
CompletableFuture<String> stringCompletableFuture = new CompletableFuture<>();
stringCompletableFuture.whenCompleteAsync((e, a) -> {
System.out.println("Complete " + e);
try {
Thread.sleep(100);
} catch (InterruptedException e1) {e1.printStackTrace();}
}, executorService);
list.add(stringCompletableFuture);
}
for (int i = 0; i < list.size(); i++) {
list.get(i).complete(i + "");
}
}
}
當我跑的代碼的隊列長度,即使我完成100個期貨僅6輸出得到打印。這是5個核心線程和1個排隊的線程。剩下的事發生了什麼?如果由於隊列已滿而導致其他可運行列表無法提交給執行程序服務,則不應該出現異常。
輸出
Complete 0
Complete 1
Complete 2
Complete 3
Complete 4
Complete 5