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

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

阅读 6.7k
3 个回答
    @Async
    public void asyncTest(int i) throws InterruptedException {
        System.out.println("线程" + Thread.currentThread().getName() + " 执行异步任务:" + i);
        //模拟任务执行时间:500ms
        Thread.sleep(500);
        countDownLatch.countDown();

    }

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

@Async

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题