使用 CompletableFuture.runAsync() 与 ForkJoinPool.execute()
Using CompletableFuture.runAsync() vs ForkJoinPool.execute()
不将 Executor
传递给 CompletableFuture.runAsync()
,而是使用普通的 ForkJoinPool
。相反,对于我想要异步执行的简单任务(例如,我不需要链接不同的任务),我可能只使用 ForkJoinPool.commonPool().execute()
。
为什么一个比另一个更受青睐?例如,runAsync()
相对于 execute()
是否有任何实质性开销?前者比后者有什么具体优势吗?
CompletableFuture Is not only used for asynchronous future objects, it has some additional advantages and features for tracking the Future
task using isDone, isCancelled and isCompletedExceptionally 等..
To simplify monitoring, debugging, and tracking, all generated asynchronous tasks are instances of the marker interface CompletableFuture.AsynchronousCompletionTask.
这是一个场景,我可以解释使用 ForkJoinPool.execute
和 CompletableFuture.runAsync
之间的区别
ForkJoinPool.execute 在使用execute
方法时,如果Runnable
任务抛出任何异常,那么执行将异常终止,所以你需要尝试catch 来处理任何意外的异常
ForkJoinPool.commonPool().execute(()->{
throw new RuntimeException();
});
输出:
Exception in thread "ForkJoinPool.commonPool-worker-5" java.lang.RuntimeException
at JavaDemoTest/com.test.TestOne.lambda(TestOne.java:17)
CompletableFuture.runAsync 但在使用 CompletableFuture
时,您可以让 exceptionally
处理任何意外异常
CompletableFuture<Void> complete = CompletableFuture.runAsync(() -> {
throw new RuntimeException();
}).exceptionally(ex -> {
System.out.println("Exception handled");
return null;
});
输出:
Exception handled
ForkJoinPool.commonPool().execute() returns 无效。您无法跟踪或控制任务的执行。
ForkJoinPool.commonPool().submit() returns 实现 Future 的 ForkJoinTask。您可以使用 Future.isDone、Future.get() 或 Future.cancel.
等同步接口跟踪或取消任务
CompletableFuture.runAsync returns CompletableFuture。除了同步接口,它还有异步接口,允许触发其他CompletableFutures,例如
CompletableFuture.runAsync(task).thenAccept(anothertask);
不将 Executor
传递给 CompletableFuture.runAsync()
,而是使用普通的 ForkJoinPool
。相反,对于我想要异步执行的简单任务(例如,我不需要链接不同的任务),我可能只使用 ForkJoinPool.commonPool().execute()
。
为什么一个比另一个更受青睐?例如,runAsync()
相对于 execute()
是否有任何实质性开销?前者比后者有什么具体优势吗?
CompletableFuture Is not only used for asynchronous future objects, it has some additional advantages and features for tracking the Future
task using isDone, isCancelled and isCompletedExceptionally 等..
To simplify monitoring, debugging, and tracking, all generated asynchronous tasks are instances of the marker interface CompletableFuture.AsynchronousCompletionTask.
这是一个场景,我可以解释使用 ForkJoinPool.execute
和 CompletableFuture.runAsync
ForkJoinPool.execute 在使用execute
方法时,如果Runnable
任务抛出任何异常,那么执行将异常终止,所以你需要尝试catch 来处理任何意外的异常
ForkJoinPool.commonPool().execute(()->{
throw new RuntimeException();
});
输出:
Exception in thread "ForkJoinPool.commonPool-worker-5" java.lang.RuntimeException
at JavaDemoTest/com.test.TestOne.lambda(TestOne.java:17)
CompletableFuture.runAsync 但在使用 CompletableFuture
时,您可以让 exceptionally
处理任何意外异常
CompletableFuture<Void> complete = CompletableFuture.runAsync(() -> {
throw new RuntimeException();
}).exceptionally(ex -> {
System.out.println("Exception handled");
return null;
});
输出:
Exception handled
ForkJoinPool.commonPool().execute() returns 无效。您无法跟踪或控制任务的执行。
ForkJoinPool.commonPool().submit() returns 实现 Future 的 ForkJoinTask。您可以使用 Future.isDone、Future.get() 或 Future.cancel.
等同步接口跟踪或取消任务CompletableFuture.runAsync returns CompletableFuture。除了同步接口,它还有异步接口,允许触发其他CompletableFutures,例如
CompletableFuture.runAsync(task).thenAccept(anothertask);