package com.mtools.cyclebarrier.test;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
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 (BrokenBarrierException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException 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();
}
}
}