下面的示例代码我正在注入一个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