1.CyclicBarrier是一个同步辅助类,跟CountLatch类似,不过CountLatch是为了让一个主线程陷入阻塞,而CyclicBarrier是为了让当中的N个线程陷入阻塞.
2.介绍:CyclicBarrier:
3.使用场景:比如对一个大文件,进行分布字节传输时,只有全部线程传输完对应的字节,那么此次传输才算完成,否则要是有一个线程没有传输完对应的字节,那么其它传输完的线程机会陷入阻塞状态。
4.实例:
文件传输类:
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.TimeUnit;
public class UploadsDuoXianCheng implements Runnable{
String countBytes;//传输字节数
CyclicBarrier barrier;
public UploadsDuoXianCheng(String countBytes,CyclicBarrier barrier){
this.countBytes=countBytes;
this.barrier=barrier;
}
@Override
public void run() {
try {
System.out.println("文件正在传输相对应字节:"+countBytes);
TimeUnit.SECONDS.sleep(2);//模拟传输
System.out.println("文件传输相对应字节数完成:"+countBytes);
//等待其它线程完成相对应的传输
barrier.await();
System.out.println("文件传输完毕");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
线程启动文件传输:
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierTest {
static class TotalTask extends Thread{
@Override
public void run() {
System.out.println("所有线程已经传输完相对应字节数,传输完成");
}
}
public static void main(String[] args) {
CyclicBarrier barrier=new CyclicBarrier(3,new TotalTask());
UploadsDuoXianCheng duoXianCheng1=new UploadsDuoXianCheng("0-300",barrier);
UploadsDuoXianCheng duoXianCheng2=new UploadsDuoXianCheng("301-400",barrier);
UploadsDuoXianCheng duoXianCheng3=new UploadsDuoXianCheng("401-500",barrier);
new Thread(duoXianCheng1).start();
new Thread(duoXianCheng2).start();
new Thread(duoXianCheng3).start();
System.out.println("main主线程结束");
}
}
结果: