Spring默认线程池 simpleAsyncTaskExecutor
Spring异步线程池的接口类是TaskExecutor ,本质还是 java.util.concurrent.Executor,没有配置的情况下,默认使用的是 simpleAsyncTaskExecutor
@Component
@EnableAsync
public class ScheduleTask {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Async
@Scheduled(fixedRate = 2000)
public void testScheduleTask() {
try {
Thread.sleep(6000);
System.out.println("Spring1自带的线程池" + Thread.currentThread().getName() + "-" + sdf.format(new Date()));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Async
@Scheduled(cron = "*/2 * * * * ?")
public void testAsyn() {
try {
Thread.sleep(1000);
System.out.println("Spring2自带的线程池" + Thread.currentThread().getName() + "-" + sdf.format(new Date()));
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
输出结果:从运行结果可以看出Spring默认的@Async用线程池名字SimpleAsyncTaskExecutor,而且每次都会重新创建一个新的线程,所以可以看到TaskExecutor-后面带的数字会一直变大。
SimpleAsyncTaskExecutor特点是每一次执行任务时,他会重新启动一个新的线程,并允许开发者控制并发线程的最大数量,从而起到一定的资源节流作用,默认是concurrencyLimit取值为 -1,即不启用资源节流。