java多线程,主线程启动多个子线程后主线程如何知道所有子线程都执行完成

java多线程,主线程启动多个子线程后主线程如何知道所有子线程都执行完成?

答案:使用 CountDownLatch

  • 测试入口
@RestController
@RequiredArgsConstructor
public class ThreadController {

    private final ThreadPoolTaskExecutor pool;

    @GetMapping("/task/{total}")
    public String doTask(@PathVariable int total){
        //核心代码CountDownLatch
        CountDownLatch countDownLatch = new CountDownLatch(total);
        for (int i = 1; i <= total; i++) {
            pool.execute(new ThreadTask(i,total,countDownLatch));
        }

        try {
            countDownLatch.await();
            System.out.println("总数为" + total + "的请求所有线程执行完成");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        return  "ok";
    }
}
复制代码
  • 具体线程类
ublic class ThreadTask extends Thread {

    int index;
    int total;
    private CountDownLatch countDownLatch;

    public ThreadTask(int index ,int total,CountDownLatch countDownLatch){
        this.index = index;
        this.total = total;
        this.countDownLatch = countDownLatch;
    }
    @Override
    public void run() {
        System.out.println("总数为" + total + "的请求线程任务" + index + "执行开始");
        try {
            sleep(new Random().nextInt(10000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("总数为" + total + "的请求线程任务" + index + "执行完成");
        countDownLatch.countDown();
    }
}
复制代码
  • 线程池配置
@Configuration
@ConfigurationProperties(prefix="threadpool")
public class ExecutePoolConfiguration {

    @Value("${threadpool.core-pool-size}")
    private int corePoolSize;

    @Value("${threadpool.max-pool-size}")
    private int maxPoolSize;

    @Value("${threadpool.queue-capacity}")
    private int queueCapacity;

    @Value("${threadpool.keep-alive-seconds}")
    private int keepAliveSeconds;


    @Bean(name="threadPoolTaskExecutor")
    public ThreadPoolTaskExecutor threadPoolTaskExecutor(){
        ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor();
        pool.setKeepAliveSeconds(keepAliveSeconds);
        pool.setCorePoolSize(corePoolSize);//核心线程池数
        pool.setMaxPoolSize(maxPoolSize); // 最大线程
        pool.setQueueCapacity(queueCapacity);//队列容量
        pool.setRejectedExecutionHandler(new java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy()); 
        return pool;
    }
}


复制代码
  • 配置文件
threadpool:
  core-pool-size: 10
  max-pool-size: 20
  queue-capacity: 1000
  keep-alive-seconds: 300
复制代码
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

栈江湖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值