情境使用:在ForkJoinPool中运行任务与新线程

问题描述 投票:3回答:1

由于我试图了解Java 8中提供的一些新功能,因此我遇到了以下情况:

我希望在我的应用程序中实现异步方法调用(在JavaFX中)。我们的想法是为与GUI相关的所有内容提供/使用单独的线程,以便后台任务不会阻止/延迟我的应用程序中的可见输出。

对于后台任务,我想到要么使用一个线程池,要么只是在应用程序的主线程中运行它们。然后,当我做这样的事情时,我发现了使用ForkJoinPool类以标准方式使用的CompletableFuture

CompletableFuture.runAsync(task);

taskRunnable

在大多数教程和Javadoc中,ForkJoinPool被描述为“包含等待任务运行的线程的池”。此外,ForkJoinPool通常是用户计算机核心的大小,如果支持超线程,则加倍。

当我想要异步运行任务时,ForkJoinPool给我的优点是传统的Thread

java multithreading java-threads completable-future
1个回答
2
投票

ForkJoinPool与Threads不具有可比性,它与ThreadPools相当。通过代码创建新线程通常很糟糕,并且会导致OutOfMemoryErrors,因为它不受控制。根据您的使用情况,您可能需要使用ForkJoinPool或其他池,但请确保使用一个。顺便说一句,所有CompletableFuture方法都有重载,允许您传递自己的线程池。

ForkJoinPool的一些好处,

  • 已经为您初始化并在JVM关闭时关闭,因此您不必担心这一点
  • 其大小可以通过VM参数控制
  • 它非常适合计算绑定任务,其中工作窃取可能是有益的,尽管根据具体情况这可能是一个问题。
© www.soinside.com 2019 - 2024. All rights reserved.