CycleBarrier使用实例源码说明。
[java] view plaincopy在CODE上查看代码片派生到我的代码片
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.TimeUnit;
public class TestCyclicBarrier {
private static final int THREAD_NUM = 5;
public static class WorkerThread implements Runnable{
CyclicBarrier barrier;
String name;
int count;
public WorkerThread(CyclicBarrier b, String n, int i){
this.barrier = b;
this.name = n;
this.count = i;
}
@Override
public void run() {
// TODO Auto-generated method stub
try{
if(this.count<=2){
System.out.println(this.name+” sleep…”);
Thread.sleep(3000);
}
System.out.println(this.name + ” Worker’s waiting”);
//线程在这里等待,直到所有线程都到达barrier。
barrier.await(1, TimeUnit.SECONDS);
System.out.println(this.name + ” ID:”+Thread.currentThread().getId()+” Working”);
}catch(Exception e){
// e.printStackTrace();
}
}
}
/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
// 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(“\nInside Barrier\n”);
}
});
for(int i=0;i<THREAD_NUM;i++){
new Thread(new WorkerThread(cb, “before”+i, i)).start();
}
// Thread.sleep(1000);
// for(int i=0;i<THREAD_NUM;i++){
// new Thread(new WorkerThread(cb, “after”+i, i)).start();
// }
}
}
[java] view plaincopy在CODE上查看代码片派生到我的代码片
public class AddWorker implements Runnable{
ArrayBlockingQueue<Integer> q;
CyclicBarrier bar;
int [] a;
int s, e;
public AddWorker(ArrayBlockingQueue<Integer> q, CyclicBarrier b, int [] a, int s, int e){
this.q = q;
this.bar = b;
this.a = a;
this.s = s;
this.e = e;
}
@Override
public void run() {
int sum = 0;
for(int i=s; i<=e; i++){
sum += a[i];
}
System.out.println(“AddWorker sum = “+sum);
q.add(sum);
try {
bar.await();
} catch (InterruptedException | BrokenBarrierException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String [] args){
final ArrayBlockingQueue<Integer> q = new ArrayBlockingQueue<Integer>(3);
int [] a = {1,2,3,4,5,6,7,8,9,20};
CyclicBarrier bar = new CyclicBarrier(2, new Runnable(){
public void run(){
int sum = 0;
while(!q.isEmpty()){
int i = (int) q.remove();
System.out.println(“get element = “+i);
sum += i;
}
System.out.println(“final result = “+sum);
}
});
for(int i=0; i<2; i++){
new Thread(new AddWorker(q, bar, a, i*5, (i+1)*5-1)).start();
}
}
}