Note
springboot线程池使用,ThreadPoolTaskExecutor是springboot基于ThreadPoolExcutor再封装的,我们可以注册到Bean容器,单实例多线程的情况下,去使用该线程池。缺点是非懒加载,初始化需要内存
Github
地址:https://github.com/ithuhui/hui-base-java
分支:master
模块:【hui-base-thread】
位置:com.hui.base.thread.springboot
Code
Config
该配置类把ThreadPoolTaskExecutor注册成SpringBean
@Configuration
public class ThreadPoolExcutorsConfig {
@Bean
public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor();
// 核心线程数
poolTaskExecutor.setCorePoolSize(5);
//最大线程数
poolTaskExecutor.setMaxPoolSize(20);
//空闲存活时间
poolTaskExecutor.setKeepAliveSeconds(60);
//队列数量
poolTaskExecutor.setQueueCapacity(2000);
//线程名字前缀
poolTaskExecutor.setThreadNamePrefix("Hui-Thread-");
// rejection-policy:当pool已经达到max size的时候,如何处理新任务
// CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
poolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
poolTaskExecutor.initialize();
return poolTaskExecutor;
}
}
ThreadPool
CountdownLatch为了让线程全部执行完再运行下面程序
@Service
@Slf4j
public class SpringbootThreadService {
@Autowired
private ThreadPoolTaskExecutor threadPoolTaskExecutor;
public void testThread() throws InterruptedException {
int countNum = 10000;
final CountDownLatch countDownLatch = new CountDownLatch(countNum);
for (int i = 0; i < countNum; i++) {
threadPoolTaskExecutor.execute(new Counter(i,countDownLatch));
}
countDownLatch.await();
}
@AllArgsConstructor
class Counter implements Runnable{
private Integer count;
private CountDownLatch countDownLatch;
@Override
public void run() {
log.info("my - count {}" , count);
log.info("latch - count {}",countDownLatch.getCount());
countDownLatch.countDown();
}
}
}
Test
public class SpringbootThreadServiceTest extends BaseJunitTest {
@Autowired
private SpringbootThreadService springbootThreadService;
@Test
public void testThread() throws InterruptedException {
springbootThreadService.testThread();
}
}