您的位置 首页 java

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

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

答案:使用 CountDownLatch

  • 测试入口
 @RestController
@RequiredArgsConstructor
public class  Thread Controller {

     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 (Interrupted Exception  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  

java8已经出来的一个CompletableFuture,的效果会优于 CountDownLatch

文章来源:智云一二三科技

文章标题:java主线程启动多个子线程后如何知道所有子线程都执行完成

文章地址:https://www.zhihuclub.com/198482.shtml

关于作者: 智云科技

热门文章

网站地图