CyclicBarrier
1. CyclicBarrier
- 循环屏障,语法和CountDownLatch差不多;使用await(),计算器不为0就-1。
- 和CountDownLatch区别是可以重复执行,而且构造方法可以直接提供一个阻塞的线程,等待计数器为0的时候再执行。
基本语法
//初始化一个cyclicBarrier 计数器为2
CyclicBarrier cyclicBarrier = new CyclicBarrier(2);
//阻塞 计数器不为0的时候并且会把计数器-1
cyclicBarrier.await();
2. 示例代码
package org.example.CyclicBarrier;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
@Slf4j
public class CyclicBarrierTest {
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(2, () -> log.debug("t1 t2 end"));
ExecutorService service = Executors.newFixedThreadPool(2);
for (int j = 0; j < 2; j++) {
service.submit(() -> {
log.debug("t0 start");
try {
TimeUnit.SECONDS.sleep(1);
log.debug("t0 working");
cyclicBarrier.await();
} catch (Exception e) {
e.printStackTrace();
}
});
service.submit(() -> {
log.debug("t1 start");
try {
TimeUnit.SECONDS.sleep(3);
log.debug("t1 working");
cyclicBarrier.await();
} catch (Exception e) {
e.printStackTrace();
}
});
}
service.shutdown();
}
}