利用@Async实现多线程,如果进行阻塞等待所有结果处理完毕?使用countDownLatch.await()为何无效?
@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()来阻塞,等待所有线程执行完毕,然而使用后无效,求解~
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
countDownLatch.countDown(); 不放在Test里,放在执行任务代码里试下。
另外按理来说你这个代码应该是打印十次才对,跟核心线程数应该是没关系的吧
表示这个方法会以一个新的线程来运行。 countDownLatch是用来控制当前线程的,当前线程和新的线程当然没有关联。
你这应该只有主线程减去1,countDownLatch.countDown()应该放到子线程里面