首先是ExecutorService 的isTerminated()和awaitTermination()
其次是CountDownLatch 继承了AQS锁的性能是优于前者悲观锁的
然后直接贴代码
package com.minio.test;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**
* @Author WangXiaoLong
* @Date 2022/6/24 16:21
* @Version 1.0
*/
@Slf4j
public class MyExecutor {
static class ThreadWord1 implements Runnable{
private final int index;
private final CountDownLatch countDown;
public ThreadWord1(int index, CountDownLatch countDown) {
this.index = index;
this.countDown = countDown;
}
@Override
public void run() {
try {
System.out.println("[" + this.index + "] start....");
Thread.sleep((int) (Math.random() * 100));
System.out.println("[" + this.index + "] end.");
System.out.println("------------------------");
} catch (Exception e) {
e.printStackTrace();
} finally {
countDown.countDown();
}
}
}
static class ThreadWord2 implements Runnable{
private final int index;
public ThreadWord2(int index) {
this.index = index;
}
@Override
public void run() {
try {
System.out.println("[" + this.index + "] start....");
Thread.sleep((int) (Math.random() * 100));
System.out.println("[" + this.index + "] end.");
System.out.println("------------------------");
} catch (Exception e) {
e.printStackTrace();
}
}
}
@SneakyThrows
public static void main(String[] args) {
int count = 100;
CountDownLatch countDown = new CountDownLatch(count);
ExecutorService service = Executors.newFixedThreadPool(6);
for (int i = 0; i < count; i++) {
// service.execute(new ThreadWord1(i, countDown));
service.execute(new ThreadWord2(i));
}
service.shutdown();
//way1
way(service);
// countDown.await();
System.out.println("submit finish");
}
public static void way(ExecutorService service){
while (!service.isTerminated()) {
try {
service.awaitTermination(5, TimeUnit.SECONDS);
} catch (InterruptedException e) {
log.error(e.getMessage());
}
}
}
}
欢迎指出错误,谢谢