import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.Callable;
import java.util.concurrent.CyclicBarrier;
public class Runner implements Callable<String>{
// 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)
private CyclicBarrier barrier;
BlockingQueue<String> queue;
private String name;
public Runner(CyclicBarrier barrier, String name,BlockingQueue<String> queue) {
super();
this.barrier = barrier;
this.name = name;
this.queue=queue;
}
@Override
public String call() throws Exception {
try {
Thread.sleep(1000 * (new Random()).nextInt(8));
queue.add((1000 * (new Random()).nextInt(8) )+"");
System.out.println(name + " 准备好了...");
// barrier的await方法,在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。
barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(name + " 起跑!");
return (1000 * (new Random()).nextInt(8) )+"";
}
}
import java.io.IOException;
import java.util.Iterator;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* @author JS-007
*
*/
public class CyclicBarrierTest {
public static void main(String[] args) throws IOException, InterruptedException {
BlockingQueue<String> queue =dd();
Iterator iter = queue.iterator();
int i=0;
while(iter.hasNext()) {
String str= (String)iter.next();
System.out.println(str);
}
}
public static BlockingQueue<String> dd(){
final BlockingQueue<String> queue = new ArrayBlockingQueue<String>(1000);
CyclicBarrier barrier = new CyclicBarrier(3,new Runnable() {
@Override
public void run() {
System.out.println(queue.size());
}
});
ThreadPoolExecutor pool = new ThreadPoolExecutor(10, 70, 5, TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(10000),new ThreadPoolExecutor.CallerRunsPolicy());
Future<String> future1=pool.submit(new Runner(barrier, "1号选手",queue));
Future<String> future2=pool.submit(new Runner(barrier, "2号选手",queue));
Future<String> future3=pool.submit(new Runner(barrier, "3号选手",queue));
pool.shutdown();
while(true){
pool.isTerminated();
return queue;
}
}
}