利用@Async实现多线程,如果进行阻塞等待所有结果处理完毕?使用countDownLatch.await()为何无效?

发布于 2022-09-12 03:18:42 字数 1623 浏览 26 评论 0

    @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;
    }
}

image.png
由于设置了核心线程数为3,所以就只执行了前3个线程,就结束了...,如果做到让他把所有线程都执行完毕再结束?从网上查到资料说用countDownLatch.await()来阻塞,等待所有线程执行完毕,然而使用后无效,求解~

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

太阳哥哥 2022-09-19 03:18:42
    @Async
    public void asyncTest(int i) throws InterruptedException {
        System.out.println("线程" + Thread.currentThread().getName() + " 执行异步任务:" + i);
        //模拟任务执行时间:500ms
        Thread.sleep(500);
        countDownLatch.countDown();

    }

countDownLatch.countDown(); 不放在Test里,放在执行任务代码里试下。
另外按理来说你这个代码应该是打印十次才对,跟核心线程数应该是没关系的吧

梦里°也失望 2022-09-19 03:18:42
@Async

表示这个方法会以一个新的线程来运行。 countDownLatch是用来控制当前线程的,当前线程和新的线程当然没有关联。

冬天旳寂寞 2022-09-19 03:18:42

你这应该只有主线程减去1,countDownLatch.countDown()应该放到子线程里面

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文