1.概念
CyclicBarrier的字面意思是,可循环使用的屏障。它是一个同步工具类,它允许一组线程互相等待,直到到达某个公共屏障点。
2.用法
(1)
public static void main(String[] args) {
ExecutorService service = Executors.newCachedThreadPool();
// 创建CyclicBarrier对象,并设置屏障数量为3
final CyclicBarrier barrier = new CyclicBarrier(3);
for(int i=0; i<3; i++){
service.execute(new Runnable() {
public void run() {
try {
Double d = Math.random() * 10000;
Thread.sleep(d.longValue());
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程:"+Thread.currentThread().getName()+"即将达到集合点1,已有"+barrier.getNumberWaiting()+"个线程正在等候");
try {
barrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
try {
Double d = Math.random() * 10000;
Thread.sleep(d.longValue());
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程:"+Thread.currentThread().getName()+"即将达到集合点2,已有"+barrier.getNumberWaiting()+"个线程正在等候");
try {
barrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}
});
}
service.shutdown();
}
(2)如果在构造CyclicBarrier的时候,传入一个Runnable,则每次达到公共屏障前,都优先执行传入的线程
public static void main(String[] args) {
ExecutorService service = Executors.newCachedThreadPool();
// 创建CyclicBarrier对象,并设置屏障数量为3
final CyclicBarrier barrier = new CyclicBarrier(3, new Runnable() {
public void run() {
System.out.println("------优先执行------");
}
});
for(int i=0; i<3; i++){
service.execute(new Runnable() {
public void run() {
try {
Double d = Math.random() * 10000;
Thread.sleep(d.longValue());
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程:"+Thread.currentThread().getName()+"即将达到集合点1,已有"+barrier.getNumberWaiting()+"个线程正在等候");
try {
barrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
try {
Double d = Math.random() * 10000;
Thread.sleep(d.longValue());
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程:"+Thread.currentThread().getName()+"即将达到集合点2,已有"+barrier.getNumberWaiting()+"个线程正在等候");
try {
barrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}
});
}
service.shutdown();
}