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