柵欄(CyclicBarrier類)的用法
阿新 • • 發佈:2019-01-08
import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
/**
* 模擬一個工廠, 需要將所有工人數出來的螺釘數目,進行一個合計,
* 有些人數的慢,有些人數的快
* @author jianlong
* @version 2016年1月15日 下午1:09:06
*/
public class CyclicBarrierDemo2 {
private final CyclicBarrier barrier;
private final Worker[] workers;//所有工人
private final int workerNo;//工人的數目
private int readyNum = 0; //完成人數初始化為0
public CyclicBarrierDemo2() { workerNo = Runtime.getRuntime().availableProcessors(); this.barrier = new CyclicBarrier(workerNo,new Runnable() { @Override public void run() { calcNewValues(); } }); workers = new Worker[workerNo];//初始化工人 for(int i=0;i<workerNo;i++){ workers[i] = new Worker(); } } public static void main(String[] args) { CyclicBarrierDemo2 cyclicBarrierDemo2 = new CyclicBarrierDemo2(); //啟動所有工人,開始進行計算 for(int i=0;i<cyclicBarrierDemo2.workerNo;i++){ new Thread(cyclicBarrierDemo2.workers[i]).start(); } } /** * @author jianlong * @version 2016年1月15日 下午1:07:43 */ protected void calcNewValues() { //拿出所有的工人數出來的螺釘,然後統計其數目 int sum = 0; for(int i=0;i<workerNo;i++){ sum+=workers[i].num; System.out.println("第"+i+"位:"+workers[i].num); } System.out.println("一共有"+sum+"個螺釘"); } private class Worker implements Runnable{ private int num; @Override public void run() { //生成隨機數值 num = new Random().nextInt(100); try { //生成隨機的停頓時間,模擬工人工作的時間,都是不一樣,最多10秒 Thread.sleep(new Random().nextInt(10000)); } catch (InterruptedException e) { e.printStackTrace(); } ++readyNum; System.out.println("readNum的值是:"+readyNum); //while(readyNum!=4){ //說明還有工人沒有完成,就需要等待? 不需要這麼幹. //這個地方不需要進行判斷,因為CyclicBarrier就是幹這個 //事情的,當等待的人數到達CyclicBarrier建構函式中設定的值後,barrier就會自動開啟柵欄。 try { barrier.await(); } catch (InterruptedException | BrokenBarrierException e) { e.printStackTrace(); } //} } }
}