Java 情境使用:在ForkJoinPool和新线程中运行任务
由于我试图理解Java 8中提供的一些新特性,因此遇到了以下情况: 我希望在我的应用程序中实现异步方法调用(在JavaFX中)。其想法是为与GUI相关的所有内容提供/使用单独的线程,以便后台任务不会阻止/延迟应用程序中的可见输出 对于后台任务,我考虑使用一个线程池,或者现在只在应用程序的主线程中运行它们。然后,在执行类似操作时,我使用了Java 情境使用:在ForkJoinPool和新线程中运行任务,java,multithreading,java-threads,completable-future,Java,Multithreading,Java Threads,Completable Future,由于我试图理解Java 8中提供的一些新特性,因此遇到了以下情况: 我希望在我的应用程序中实现异步方法调用(在JavaFX中)。其想法是为与GUI相关的所有内容提供/使用单独的线程,以便后台任务不会阻止/延迟应用程序中的可见输出 对于后台任务,我考虑使用一个线程池,或者现在只在应用程序的主线程中运行它们。然后,在执行类似操作时,我使用了CompletableFuture类,以标准方式使用了: CompletableFuture.runAsync(task); 而任务是一个可运行的任务 在大多数
CompletableFuture
类,以标准方式使用了:
CompletableFuture.runAsync(task);
而任务
是一个可运行的任务
在大多数教程和Javadoc中,ForkJoinPool
被描述为“包含等待任务运行的线程的池”。另外,ForkJoinPool
通常是用户机器的内核大小,如果支持超线程,则是双倍大小
当我想异步运行任务时,
ForkJoinPool
与传统的线程
相比有什么优势?ForkJoinPool
与线程不可比,与线程池相当。通过代码创建新线程通常是错误的,并且会导致OutOfMemoryErrors
,因为它不受控制。根据您的用例,您可能需要使用ForkJoinPool
或其他池,但请确保使用一个。顺便说一下,所有的CompletableFuture
方法都有重载,允许您传递自己的线程池
ForkJoinPool的一些好处
- 已经为您初始化并在JVM关闭时关闭,所以您不必担心这一点
- 它的大小可以通过VM参数控制
- 它非常适合计算范围内的任务,工作窃取可能是有益的,尽管这可能是一个问题,取决于具体情况
ForkJoinPool
在池中的线程之间提供了预先存在的负载平衡。如果您正在实现JavaFX应用程序,您可能应该首先了解JavaFX提供了什么,如和。