三个Java多线程循环顺序周期打印1-75个数(用CyclicBarrier实现代码)

来源:互联网 发布:金融数据挖掘 编辑:程序博客网 时间:2024/05/21 16:55
package net.liuyx.java;import java.util.ArrayList;import java.util.List;import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;public class PrintNum {    static final int FINAL_NUM = 75;    private List<PrintTasks> tasks = new ArrayList<PrintTasks>();    private ExecutorService exec = Executors.newCachedThreadPool();    private CyclicBarrier barrier;    public PrintNum(int nTasks, final int pause) {        barrier = new CyclicBarrier(nTasks,new Runnable() {            @Override            public void run() {                for(PrintTasks task : tasks)                    if(task.getNum() >= FINAL_NUM) {                        exec.shutdownNow();                        return;                    }else {                        task.printNum();                    }            }        });        try {            TimeUnit.MILLISECONDS.sleep(pause);        } catch (InterruptedException e) {            e.printStackTrace();        }        for(int i = 0; i < nTasks; i++) {            PrintTasks task = new PrintTasks(barrier);            tasks.add(task);            exec.execute(task);        }    }    public static void main(String[] args) {        new PrintNum(3,100);    }}class PrintTasks implements Runnable{    private static int counter = 0;    private final int id = counter++;    private static volatile int num = 0;        private CyclicBarrier barrier;    public PrintTasks(CyclicBarrier b) {        barrier = b;    }        public synchronized int getNum() {        return num;    }    @Override    public void run() {        try {            while(!Thread.interrupted()) {                barrier.await();            }        } catch (InterruptedException e) {        } catch (BrokenBarrierException e) {            throw new RuntimeException(e);        }    }        public void printNum() {        System.out.print("线程 " + id + ": ");        for(int i = 0; i < 5; i++) {            System.out.format("%3d", ++num);        }        System.out.println();    }}