Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用CompletableFuture.runAsync()与ForkJoinPool.execute()的比较_Java_Multithreading_Asynchronous_Completable Future_Forkjoinpool - Fatal编程技术网

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(可调用)
将是首选。为什么要搞得更糟?