如何在 Spring Boot @Async 中使用 ForkJoinPool?

Hit*_*esh 2 java spring java.util.concurrent forkjoinpool spring-boot

我想在我的 Spring Boot 项目中使用 ForkJoinPool 和 @Async 注释,比如 ThreadPoolTask​​Executor

例如 :-

 @Bean("threadPoolTaskExecutor")
    public TaskExecutor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(20);
        executor.setMaxPoolSize(1000);
        executor.setThreadNamePrefix("Async-");
        return executor;
    }
Run Code Online (Sandbox Code Playgroud)

我在我的代码中使用https://dzone.com/articles/spring-boot-creating-asynchronous-methods-using-作为这个链接,但我想像这样使用 ForkJoinPool 。

mwd*_*dev 5

将 ForkJoinPool 与异步一起使用很好。这种方法并不完全是 ForkJoinPool 的设计目的——解决分而治之任务并使用工作窃取算法,而是执行事件样式或 IO 阻塞任务,这是一个有效的用例。

因此,使用基本用法,您可以执行以下操作:

CompletableFuture.runAsync(() -> doSomething(), ForkJoinPool.commonPool());
Run Code Online (Sandbox Code Playgroud)

您还可以在异步模式下创建自定义 ForkJoinPool。异步模式下 ForkJoinPool 中的工作人员以 FIFO(先进先出)顺序处理任务。默认情况下,ForkJoinPools 以 LIFO(后进先出)顺序处理此类任务。此外,异步模式设置仅涉及从未加入的分叉任务。可用于提交但从未加入的事件样式任务(为副作用而执行的任务,而不是返回将由分叉任务处理然后加入的结果)。

您可以像这样在异步模式下创建具有给定并行度的自定义 ForkJoinPool(第一个参数是池大小,最后一个 - bool asyncMode):

ForkJoinPool pool = new ForkJoinPool(
             6, ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true);
Run Code Online (Sandbox Code Playgroud)

所以你所追求的是:

    @Bean("threadPoolTaskExecutor")
    public Executor getAsyncExecutor() {
    ForkJoinPool pool = new ForkJoinPool(
             6, ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true);
        return pool;
    }
Run Code Online (Sandbox Code Playgroud)