CyclicBarrier
多个线程在一个屏障上互相等待,直到所有线程都到达了,再执行一个同步程序
示例:1000W个订单需要处理,分成1000批处理
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierTest {
CyclicBarrier barrier;
/**
* 每取1000页的数据,进行一次处理
*/
int page = 0;
public CyclicBarrierTest() {
barrier = new CyclicBarrier(2, () -> {
// 2个线程,执行同步(处理数据)
System.out.println("Sync");
page++;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
void prepareProducts() {
while (page < 1000) {
try {
// 获取商品
System.out.println("fetch product...");
barrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}
}
void prepareDeliveryOrders() {
while (page < 1000) {
try {
// 获取发货单
System.out.println("fetch delivery orders...");
barrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}
}
void run() {
new Thread(this::prepareProducts).start();
new Thread(this::prepareDeliveryOrders).start();
}
public static void main(String[] args) {
var test = new CyclicBarrierTest();
test.run();
}
}