使用自定义线程池实现异步任务
配置自己的线程池
@Configuration
public class ThreadConfig {
//核心线程池大小
private final int poolSize = 10;
//最大线程数
private final int maxPoolSize = 18;
//队列容量
private final int queueCapacity = 30;
//活跃时间/秒
private final int keepAliveSeconds = 30;
@Bean("myThreadPoll")
public Executor myThreadPool() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(poolSize);
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(queueCapacity);
executor.setKeepAliveSeconds(keepAliveSeconds);
executor.setThreadNamePrefix("myThread-zgl-");//前缀名
//当池中的线程使用完时,新任务由调用者所在的线程执行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}
}
service代码
@Service
public class TestThreadPoolService {
@Async("myThreadPoll")
public void hi(int num) throws InterruptedException {
Thread.sleep(5000);
System.out.println("任务"+num +"由"+Thread.currentThread().getName()+"执行完成!!");
}
}
controller代码
@Controller
public class TestThreadPoolController {
@Autowired TestThreadPoolService testThreadPoolService;
@GetMapping("/hello2")
public String test() throws InterruptedException, ExecutionException {
long start = System.currentTimeMillis();
for (int i = 0; i < 50; i++) {
testThreadPoolService.hi(i);
}
System.out.println("耗时"+(System.currentTimeMillis() - start)+"毫秒" );
return "index";
}
}
运行代码结果:
任务5由myThread-zgl-6执行完成!!
任务47由myThread-zgl-18执行完成!!
任务42由myThread-zgl-13执行完成!!
任务9由myThread-zgl-10执行完成!!
任务48由http-nio-8081-exec-1执行完成!!
任务4由myThread-zgl-5执行完成!!
任务2由myThread-zgl-3执行完成!!
任务1由myThread-zgl-2执行完成!!
任务7由myThread-zgl-8执行完成!!
任务3由myThread-zgl-4执行完成!!
任务45由myThread-zgl-16执行完成!!
任务43由myThread-zgl-14执行完成!!
任务6由myThread-zgl-7执行完成!!
任务0由myThread-zgl-1执行完成!!
任务46由myThread-zgl-17执行完成!!
任务8由myThread-zgl-9执行完成!!
任务40由myThread-zgl-11执行完成!!
任务41由myThread-zgl-12执行完成!!
任务44由myThread-zgl-15执行完成!!
耗时5007毫秒
任务10由myThread-zgl-6执行完成!!
任务27由myThread-zgl-15执行完成!!
任务26由myThread-zgl-12执行完成!!
任务24由myThread-zgl-9执行完成!!
任务19由myThread-zgl-16执行完成!!
任务25由myThread-zgl-11执行完成!!
任务23由myThread-zgl-17执行完成!!
任务21由myThread-zgl-7执行完成!!
任务22由myThread-zgl-1执行完成!!
任务20由myThread-zgl-14执行完成!!
任务18由myThread-zgl-4执行完成!!
任务16由myThread-zgl-2执行完成!!
任务17由myThread-zgl-8执行完成!!
任务15由myThread-zgl-3执行完成!!
任务11由myThread-zgl-13执行完成!!
任务13由myThread-zgl-10执行完成!!
任务14由myThread-zgl-5执行完成!!
任务12由myThread-zgl-18执行完成!!
任务33由myThread-zgl-11执行完成!!
任务38由myThread-zgl-4执行完成!!
任务49由myThread-zgl-8执行完成!!
任务39由myThread-zgl-2执行完成!!
任务37由myThread-zgl-14执行完成!!
任务36由myThread-zgl-1执行完成!!
任务30由myThread-zgl-12执行完成!!
任务32由myThread-zgl-16执行完成!!
任务34由myThread-zgl-17执行完成!!
任务28由myThread-zgl-6执行完成!!
任务29由myThread-zgl-15执行完成!!
任务31由myThread-zgl-9执行完成!!
任务35由myThread-zgl-7执行完成!!
实现了自定义线程池来执行异步任务