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 情境使用:在ForkJoinPool和新线程中运行任务_Java_Multithreading_Java Threads_Completable Future - Fatal编程技术网

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

Java 情境使用:在ForkJoinPool和新线程中运行任务,java,multithreading,java-threads,completable-future,Java,Multithreading,Java Threads,Completable Future,由于我试图理解Java 8中提供的一些新特性,因此遇到了以下情况: 我希望在我的应用程序中实现异步方法调用(在JavaFX中)。其想法是为与GUI相关的所有内容提供/使用单独的线程,以便后台任务不会阻止/延迟应用程序中的可见输出 对于后台任务,我考虑使用一个线程池,或者现在只在应用程序的主线程中运行它们。然后,在执行类似操作时,我使用了CompletableFuture类,以标准方式使用了: CompletableFuture.runAsync(task); 而任务是一个可运行的任务 在大多数

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

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

对于后台任务,我考虑使用一个线程池,或者现在只在应用程序的主线程中运行它们。然后,在执行类似操作时,我使用了
CompletableFuture
类,以标准方式使用了:

CompletableFuture.runAsync(task);
任务
是一个
可运行的任务

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


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

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

ForkJoinPool的一些好处

  • 已经为您初始化并在JVM关闭时关闭,所以您不必担心这一点
  • 它的大小可以通过VM参数控制
  • 它非常适合计算范围内的任务,工作窃取可能是有益的,尽管这可能是一个问题,取决于具体情况

不要忘记,
ForkJoinPool
在池中的线程之间提供了预先存在的负载平衡。如果您正在实现JavaFX应用程序,您可能应该首先了解JavaFX提供了什么,如和。