Java中CyclicBarrier的用法分析
程序员文章站
2023-12-10 20:45:04
复制代码 代码如下:public class testcyclicbarrier { private static fina...
复制代码 代码如下:
public class testcyclicbarrier {
private static final int thread_num = 5;
public static class workerthread implements runnable{
cyclicbarrier barrier;
public workerthread(cyclicbarrier b){
this.barrier = b;
}
@override
public void run() {
// todo auto-generated method stub
try{
system.out.println("worker's waiting");
//线程在这里等待,直到所有线程都到达barrier。
barrier.await();
system.out.println("id:"+thread.currentthread().getid()+" working");
}catch(exception e){
e.printstacktrace();
}
}
}
/**
* @param args
*/
public static void main(string[] args) {
// todo auto-generated method stub
cyclicbarrier cb = new cyclicbarrier(thread_num, new runnable() {
//当所有线程到达barrier时执行
@override
public void run() {
// todo auto-generated method stub
system.out.println("inside barrier");
}
});
for(int i=0;i<thread_num;i++){
new thread(new workerthread(cb)).start();
}
}
}
/*
以下是输出:
worker's waiting
worker's waiting
worker's waiting
worker's waiting
worker's waiting
inside barrier
id:12 working
id:8 working
id:11 working
id:9 working
id:10 working
*/
1. cyclicbarrier初始化时规定一个数目,然后计算调用了cyclicbarrier.await()进入等待的线程数。当线程数达到了这个数目时,所有进入等待状态的线程被唤醒并继续。
2. cyclicbarrier就象它名字的意思一样,可看成是个障碍, 所有的线程必须到齐后才能一起通过这个障碍。
3. cyclicbarrier初始时还可带一个runnable的参数, 此runnable任务在cyclicbarrier的数目达到后,所有其它线程被唤醒前被执行。