情境使用:运行 ForkJoinPool 中的任务与新线程
Situational use: Run tasks in ForkJoinPool vs. new Thread
由于我试图了解 Java 8 中提供的一些新功能,我遇到了以下情况:
我希望在我的应用程序中实现异步方法调用(在 JavaFX 中)。我的想法是 provide/use 一个单独的线程来处理与 GUI 相关的所有事情,这样后台任务就不会 block/delay 我的应用程序中的可见输出。
对于后台任务,我考虑过要么使用线程池,要么暂时 运行 在应用程序的主线程中使用它们。然后,我在做这样的事情时通过使用 CompletableFuture
class 来以标准方式使用 ForkJoinPool :
CompletableFuture.runAsync(task);
而 task
是 Runnable
.
在大多数教程和 Java文档中,ForkJoinPool
被描述为“一个包含等待任务的线程的池 运行”。此外,ForkJoinPool
通常是用户机器核心的大小,如果支持超线程,则加倍。
当我想要异步 运行 任务时,ForkJoinPool
比传统的 Thread
有什么优势?
ForkJoinPool
不能与 Threads 相比,它与 ThreadPools 相当。通过代码创建新线程通常很糟糕,并且会导致 OutOfMemoryErrors
因为它不受控制。根据您的用例,您可能需要使用 ForkJoinPool
或不同的池,但请确保使用一个。顺便说一句,所有 CompletableFuture
方法都有重载,允许您传递自己的线程池。
ForkJoinPool 的一些好处,
- 已经为您初始化并在 JVM 关闭时关闭,因此您无需担心
- 它的大小可以通过 VM 参数控制
- 它非常适合计算密集型任务,其中工作窃取可能是有益的,尽管根据情况这可能是个问题。
由于我试图了解 Java 8 中提供的一些新功能,我遇到了以下情况:
我希望在我的应用程序中实现异步方法调用(在 JavaFX 中)。我的想法是 provide/use 一个单独的线程来处理与 GUI 相关的所有事情,这样后台任务就不会 block/delay 我的应用程序中的可见输出。
对于后台任务,我考虑过要么使用线程池,要么暂时 运行 在应用程序的主线程中使用它们。然后,我在做这样的事情时通过使用 CompletableFuture
class 来以标准方式使用 ForkJoinPool :
CompletableFuture.runAsync(task);
而 task
是 Runnable
.
在大多数教程和 Java文档中,ForkJoinPool
被描述为“一个包含等待任务的线程的池 运行”。此外,ForkJoinPool
通常是用户机器核心的大小,如果支持超线程,则加倍。
当我想要异步 运行 任务时,ForkJoinPool
比传统的 Thread
有什么优势?
ForkJoinPool
不能与 Threads 相比,它与 ThreadPools 相当。通过代码创建新线程通常很糟糕,并且会导致 OutOfMemoryErrors
因为它不受控制。根据您的用例,您可能需要使用 ForkJoinPool
或不同的池,但请确保使用一个。顺便说一句,所有 CompletableFuture
方法都有重载,允许您传递自己的线程池。
ForkJoinPool 的一些好处,
- 已经为您初始化并在 JVM 关闭时关闭,因此您无需担心
- 它的大小可以通过 VM 参数控制
- 它非常适合计算密集型任务,其中工作窃取可能是有益的,尽管根据情况这可能是个问题。