java - 情境使用 : Run tasks in ForkJoinPool vs. new Thread

标签 java multithreading java-threads completable-future

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

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

对于后台任务,我考虑过要么使用线程池,要么暂时在应用程序的主线程中运行它们。然后,我遇到了 ForkJoinPool在执行以下操作时,通过使用 CompletableFuture 类以标准方式使用:

CompletableFuture.runAsync(task);

task 是一个 Runnable

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

当我想异步运行任务时,ForkJoinPool 比传统的 Thread 有什么优势?

最佳答案

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

ForkJoinPool 的一些好处,

  • 已经为您初始化并在 JVM 关闭时关闭,因此您无需担心
  • 它的大小可以通过 VM 参数控制
  • 它非常适合计算密集型任务,其中工作窃取可能是有益的,尽管这可能会成为问题,具体取决于具体情况。

关于java - 情境使用 : Run tasks in ForkJoinPool vs. new Thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47963922/

相关文章:

java - Thread 类的 onSpinWait​() 方法 - Java 9

java - 对 GWT celltable Widget 中的不同属性进行排序

c# - 单例成员的线程安全使用

java - 如何正确地将 avro 模式转换为 json 模式

java - 多个 Swing 事件分发线程

.NET 事件、线程和消息

java - 在循环中杀死一个非终止进程

java - Thread 类中的构造函数 Thread 不能应用于给定类型;

java - Twitter 数据的图形可视化

java - 将不同属性类型解码到同一 java 对象时出现 NullPointerException