java,@async指定的执行器是否适用于completablefuture.supplySync(supplier)?

nfzehxib  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(357)

我有个遗嘱执行人,

@Bean("someExecutor")
public Executor someExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(2);
    executor.setMaxPoolSize(2);
    executor.setQueueCapacity(500);
    executor.setThreadNamePrefix("AsyncMethod-");
    executor.initialize();
    return executor;
}

和异步方法。

@Async("someExecutor")
public Future<List<String>> someMethod(){
    return CompletableFuture.supplyAsync(() -> {
        //long time job
        return listGeneratedByLongTimeJob;
    });
}

spring将someexecutor用于somemethod吗?怎么做?
我知道supplyasync(supplier)的重载方法是supplyasync(supplier,executor),下面的代码怎么样?

@Autowired("someExecutor")
private Executor executor;

@Async()
public Future<List<String>> someMethod(){
    return CompletableFuture.supplyAsync(() -> {
        //long time job
        return listGeneratedByLongTimeJob;
    }, executor);
}

谢谢。

j0pj023g

j0pj023g1#

好吧,我们花了一些时间来解决这个问题,在讨论两个场景之前,我们需要讨论一下 ForkJoinPool 来自java.util.concurrent.completablefuturedocs
所有没有显式executor参数的异步方法都使用forkjoinpool.commonpool()执行(除非它不支持至少两个并行级别,在这种情况下,将创建一个新线程来运行每个任务)。为了简化监视、调试和跟踪,所有生成的异步任务都是标记接口completablefuture.asynchronouscompletiontask的示例。
所以每次你打电话的时候 CompletableFuture.supplyAsync(Supplier s) ,供应商将由 ForkJoinPool 线程,现在让我们开始案例1
案例1:
为了说清楚,我补充了一些 sysout 用于打印线程名称的语句

@Async("someExecutor")
public Future<String> asyncService() {
    System.out.println();

    System.out.println(Thread.currentThread().getName()+" - "+Thread.currentThread().getThreadGroup());

    System.out.println();
    return CompletableFuture.supplyAsync(()->{

    System.out.println(Thread.currentThread().getName()+" - "+Thread.currentThread().getThreadGroup());
        return "hello";
    });

}

输出:

AsyncMethod-1 - java.lang.ThreadGroup[name=main,maxpri=10]

ForkJoinPool.commonPool-worker-1 - java.lang.ThreadGroup[name=main,maxpri=10]

在这种情况下 asyncService() 执行人 AsyncMethod-1 螺纹和供应商 supplyAsync() 执行人 ForkJoinPool 案例2:

@Autowired
private Executor someExecutor;

@Async
public Future<String> asyncService() {
    System.out.println();

    System.out.println(Thread.currentThread().getName()+" - "+Thread.currentThread().getThreadGroup());

    System.out.println();
    return CompletableFuture.supplyAsync(()->{

    System.out.println(Thread.currentThread().getName()+" - "+Thread.currentThread().getThreadGroup());
        return "hello";
    },someExecutor);

}

输出:

AsyncMethod-1 - java.lang.ThreadGroup[name=main,maxpri=10]

AsyncMethod-2 - java.lang.ThreadGroup[name=main,maxpri=10]

在第二种情况下 asyncService() 方法和供应商 supplyAsync() 两者都使用 someExecutor pool 默认情况下,spring使用simpleasynctaskexecutor实际运行这些命令 async 方法,但我们用 someExecutor 在配置中使用 @EnableAsync 文件
默认情况下,spring将搜索关联的线程池定义:上下文中唯一的taskexecutor bean,或者名为“taskexecutor”的executor bean。如果两者都不可解析,则将使用simpleasynctaskexecutor来处理异步方法调用。
注意:如果您没有 @EnableAsync 在config类中,您将得到不同的结果,我将在github中上载此代码并在此处添加链接

相关问题