Java多线程之CyclicBarrier(一)

来源:互联网 发布:西安朝阳软件 编辑:程序博客网 时间:2024/05/17 04:15

CyclicBarrier,见名思义,循环的障碍。这怎么理解呢?在Java中,这样定义一个障碍:CyclicBarrier cb = new CyclicBarrier(3);,其中参数 3 代表障碍阻挡的

线程数,也就是说,障碍物拦截到一个线程,让该线程等待,再拦截下一个线程,也让该线程等待,至到拦截到总共 3 个线程。

这时,障碍物才同是让这 3 个线程通过。设置障碍点代码:cb.await();。在本代码中,设置了三个障碍点。

package three.day.thread;



import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


public class CyclicBarrierTest {


public static void main(String[] args) {
ExecutorService service = Executors.newCachedThreadPool();
final  CyclicBarrier cb = new CyclicBarrier(3);
for(int i=0;i<3;i++){
Runnable runnable = new Runnable(){
public void run(){
try {
Thread.sleep((long)(Math.random()*10000));
System.out.println("线程" + Thread.currentThread().getName() + 
"即将到达障碍点1,当前已有" + cb.getNumberWaiting() + "个已经到达,正在等候");
cb.await();

Thread.sleep((long)(Math.random()*10000));
System.out.println("线程" + Thread.currentThread().getName() + 
"即将到达障碍点2,当前已有" + cb.getNumberWaiting() + "个已经到达,正在等候");
cb.await();

Thread.sleep((long)(Math.random()*10000));
System.out.println("线程" + Thread.currentThread().getName() + 
"即将到达障碍点3,当前已有" + cb.getNumberWaiting() + "个已经到达,正在等候");
cb.await();

} catch (Exception e) {
e.printStackTrace();
}
}
};
service.execute(runnable);

}
service.shutdown();
}

}



本例代码运行效果:

线程pool-1-thread-3即将到达障碍点1,当前已有0个已经到达,正在等候
线程pool-1-thread-2即将到达障碍点1,当前已有1个已经到达,正在等候
线程pool-1-thread-1即将到达障碍点1,当前已有2个已经到达,正在等候
线程pool-1-thread-2即将到达障碍点2,当前已有0个已经到达,正在等候
线程pool-1-thread-1即将到达障碍点2,当前已有1个已经到达,正在等候
线程pool-1-thread-3即将到达障碍点2,当前已有2个已经到达,正在等候
线程pool-1-thread-3即将到达障碍点3,当前已有0个已经到达,正在等候
线程pool-1-thread-2即将到达障碍点3,当前已有1个已经到达,正在等候
线程pool-1-thread-1即将到达障碍点3,当前已有2个已经到达,正在等候


原创粉丝点击