@Test
public void TestAsync() throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(10);
for (int i=0;i<10;i++){
try {
testService.asyncTest(i);
} catch (Exception e) {
e.printStackTrace();
} finally {
countDownLatch.countDown();
}
}
try {
countDownLatch.await();
} catch (Exception e) {
System.out.println("阻塞异常");
}
System.out.println("执行了");
}
@Async
public void asyncTest(int i) throws InterruptedException {
System.out.println("线程" + Thread.currentThread().getName() + " 执行异步任务:" + i);
//模拟任务执行时间:500ms
Thread.sleep(500);
}
@Configuration
@EnableAsync
public class AsyncConfig {
@Bean
public TaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// 设置核心线程数
executor.setCorePoolSize(3);
executor.setMaxPoolSize(5);
executor.setQueueCapacity(10);
executor.setKeepAliveSeconds(60);
executor.setThreadNamePrefix("test-async-");
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.setWaitForTasksToCompleteOnShutdown(true);
return executor;
}
}
由于设置了核心线程数为3,所以就只执行了前3个线程,就结束了...,如果做到让他把所有线程都执行完毕再结束?从网上查到资料说用countDownLatch.await()来阻塞,等待所有线程执行完毕,然而使用后无效,求解~
countDownLatch.countDown(); 不放在Test里,放在执行任务代码里试下。
另外按理来说你这个代码应该是打印十次才对,跟核心线程数应该是没关系的吧