1.简单介绍Spring自带的七个线程
2.Spring中的同步执行器
1> SyncTaskExecutor:同步执行器,这个可以说不算一个线程池,因为还在原线程执行。这个类没有实现异步调用,只是一个同步操作。
2> 也可以用ThreadPoolTaskExecutor结合FutureTask做到同步。
3.Spring中的异步线程池
使用ThreadPoolTaskExecutor(注解方式)
1>设置线程池基本配置
//开启异步线程
@EnableAsync
@Configuration
public class Pool implements AsyncConfigurer {
@Bean
public TaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// 设置核心线程数
executor.setCorePoolSize(5);
// 设置最大线程数
executor.setMaxPoolSize(5);
// 设置队列容量
executor.setQueueCapacity(20);
// 设置线程活跃时间(秒)
executor.setKeepAliveSeconds(60);
// 设置线程名称
executor.setThreadNamePrefix("taskExecutor-");
// 设置拒绝策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 等待所有任务结束后再关闭线程池
executor.setWaitForTasksToCompleteOnShutdown(true);
return executor;
}
}
2>开启异步调用,@Async不指定线程名,会默认调用。
@Configuration
public class UseTask {
@Async("taskExecutor")
public void show(int i) throws InterruptedException {
for (int j=0;j<i;j++){
System.out.println("线程:" +j + " 执行异步任务:" + Thread.currentThread().getId()+"name:"+Thread.currentThread().getName());
Thread.sleep(2000);
}
}
}
3>测试异步
@RestController
public class TestController {
@Autowired
private UseTask useTask;
@RequestMapping("/test")
public String test() throws InterruptedException {
System.out.println("#####");
useTask.show(100);
return "111";
}
}
测试结果:会先返回结果111,线程一直执行,直到结束。