您的位置:首页 > 编程语言 > Java开发

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

2017-08-17 21:54 573 查看


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

标签: 多线程javaclassstring
2012-07-20 14:44 3139人阅读 评论(0) 收藏 举报


 分类:

Java(9) 


版权声明:本文为博主原创文章,未经博主允许不得转载。

[java] view
plain copy

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();  

    }  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐