Java 使用CompletableFuture.runAsync()与ForkJoinPool.execute()的比较
在不将Java 使用CompletableFuture.runAsync()与ForkJoinPool.execute()的比较,java,multithreading,asynchronous,completable-future,forkjoinpool,Java,Multithreading,Asynchronous,Completable Future,Forkjoinpool,在不将执行器传递给CompletableFuture.runAsync()的情况下,使用公共ForkJoinPool。相反,对于我希望异步执行的简单任务(例如,我不需要链接不同的任务),我可以只使用ForkJoinPool.commonPool().execute() 为什么一个比另一个更受欢迎?例如,runAsync()?前者比后者有什么特别的优势吗?不仅用于异步未来对象,它还有一些额外的优势和功能,用于跟踪未来的任务使用等 为了简化监视、调试和跟踪,所有生成的异步任务都是标记接口Comple
执行器
传递给CompletableFuture.runAsync()
的情况下,使用公共ForkJoinPool
。相反,对于我希望异步执行的简单任务(例如,我不需要链接不同的任务),我可以只使用ForkJoinPool.commonPool().execute()
为什么一个比另一个更受欢迎?例如,runAsync()?前者比后者有什么特别的优势吗?不仅用于异步未来对象,它还有一些额外的优势和功能,用于跟踪未来的任务使用等
为了简化监视、调试和跟踪,所有生成的异步任务都是标记接口CompletableFuture.AsynchronousCompletionTask的实例
下面是一个场景,我可以解释使用ForkJoinPool.execute
和CompletableFuture.runAsync
ForkJoinPool.execute在使用execute
方法时,如果Runnable
任务引发任何异常,则执行将异常终止,因此您需要try-catch来处理任何意外的异常
ForkJoinPool.commonPool().execute(()->{
throw new RuntimeException();
});
输出:
Exception in thread "ForkJoinPool.commonPool-worker-5" java.lang.RuntimeException
at JavaDemoTest/com.test.TestOne.lambda$2(TestOne.java:17)
Exception handled
CompletableFuture.runAsync但在使用CompletableFuture
时,您可以使用异常
来处理任何意外异常
CompletableFuture<Void> complete = CompletableFuture.runAsync(() -> {
throw new RuntimeException();
}).exceptionally(ex -> {
System.out.println("Exception handled");
return null;
});
ForkJoinPool.commonPool().execute()返回void。您无法跟踪或控制任务的执行
ForkJoinPool.commonPool().submit()返回实现未来的ForkJoinTask。您可以使用同步接口(如Future.isDone、Future.get()或Future.cancel)跟踪或取消任务
CompletableFuture.runAsync返回CompletableFuture。除了同步接口之外,它还有异步接口,允许触发其他可完成的未来,例如
CompletableFuture.runAsync(task).thenAccept(anothertask);
如果您只需要一个简单的异步任务,我认为ExecutorService.submit(可调用)
将是首选。为什么要搞得更糟?