我有一个初始化为@Bean 的线程池,用于专门执行特定的@Async 方法
class MyConfig {
@Bean(name="myPool")
public static TaskExecutor getExecutor(){
ThreadPooltaskExecutor exec = new ThreadPoolTaskExecutor();
exec.setCorePoolSize(1);
exec.setMaxPoolSize(1);
exec.setThreadNamePrefix("my-thread");
exec.initialize();
return exec;
}
}
上面的线程池作为 bean 用于 Async 方法调用,如下所示:
public class MyHandler {
...
@Async("myPool")
public void handle(){
...
logger.INFO("do my thing");
...
}
...
}
还有其他类也使用默认的 Spring @Async 池,例如:
public class OtherScheduledTask {
...
@Async
public void doThat() {
logger.INFO("doing that thing");
}
...
}
在运行应用程序时,我可以在日志中看到以下内容:
[pool-1-thread-1] [] c.c.a.m.p.e.c.OtherScheduledTask - do my thing
[myPool] [] c.c.a.m.p.e.c.MyHandler - doing that thing
....
我看到上面的日志片段随机打印出来,异步方法被默认线程池和自定义线程池间歇性地执行
我确实有从非异步方法调用 @Async 方法的场景
但是,我只在 MyHandler 中使用了一个 @Async 方法 handle() 并且没有其他地方使用我的自定义线程池
为什么 spring 混合线程池(自定义和默认)来执行 @async 方法?
在 @Async 方法注解中传递 bean 名称有什么用?
我如何使用一种特定的异步方法拥有专用的线程池,以便在它不执行时让线程池处于空闲状态并且不用于其他异步方法,这些方法应该只在默认弹簧线程池中执行
关于我的环境的详细信息:Spring boot 版本 1.4.2 RELEASE JDK 1.8.0