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

java多线程 栅栏(CyclicBarrier) 和 多线程辅助类 CountDownLatch

2016-11-28 10:25 465 查看
5.JAVA 多线程: 要求所有线程执行完成后,等待未执行完的 线程执行完后,才会向下进行 用: countDownLatch countDownLatch = new CountDownLatch(int ThreadNumbers)

    在线程执行完后 调用 countDownLatch 对象的 countDown() 方法,进行减一操作,做记数 。在线程池添加完所有任务后,调用latch.await() 方法让所有执行完成了的线程等待,当都执行完了的时候    才会向下执行。

   CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

    主要方法:

     public CountDownLatch(int count); //构造方法参数指定了计数的次数

      public void countDown();  //countDown方法,当前线程调用此方法,则计数减一

     public void await() throws InterruptedException //awaint方法,调用此方法会一直阻塞当前线程,直到计时器的值为0 程序向下执行。

    实例:

 
public class CountDownLatchDemo {  
    final static SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
    public static void main(String[] args) throws InterruptedException {  
        CountDownLatch latch=new CountDownLatch(2);//两个工人的协作  
        Worker worker1=new Worker("zhang san", 5000, latch);  
        Worker worker2=new Worker("li si", 8000, latch);  
        worker1.start();//  
        worker2.start();//  
        latch.await();//等待所有工人完成工作  
        System.out.println("all work done at "+sdf.format(new Date()));  
    }  
      
      
    static class Worker extends Thread{  
        String workerName;   
        int workTime;  
        CountDownLatch latch;  
        public Worker(String workerName ,int workTime ,CountDownLatch latch){  
             this.workerName=workerName;  
             this.workTime=workTime;  
             this.latch=latch;  
        }  
        public void run(){  
            System.out.println("Worker "+workerName+" do work begin at "+sdf.format(new Date()));  
            doWork();//工作了  
            System.out.println("Worker "+workerName+" do work complete at "+sdf.format(new Date()));  
            latch.countDown();//工人完成工作,计数器减一  
  
        }  
          
        private void doWork(){  
            try {  
                Thread.sleep(workTime);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
        }  
    }  
      
       


输出:

Worker zhang san do work begin at 2011-04-14 11:05:11

Worker li si do work begin at 2011-04-14 11:05:11

Worker zhang san do work complete at 2011-04-14 11:05:16

Worker li si do work complete at 2011-04-14 11:05:19

all work done at 2011-04-14 11:05:19

6.JAVA多线程 栅栏,CyclicBarrier,作用是要求所有线程都执行到  cyc.await() 设置的障碍 处,等待其他线程一起到达后,然后同时向下执行其他操作的处理。

实例:

        public class ThreadTask implements Runnable {

    private CyclicBarrier cyclicBarrier ;

    private int rank;

    public ThreadTask(){}

    public ThreadTask(CyclicBarrier cyclicBarrier ,int rank){

        this.cyclicBarrier = cyclicBarrier;

        this.rank = rank;

    }

    @Override

    public void run() {

        for (int i = 0; i < 10; i++) {

            System.out.println("任务:"+rank+"---执行中。。。");

        }

        try {

            cyclicBarrier.await();

            System.out.println("任务:"+rank+"****************已到达指定地点,处于等待状态。");

        } catch (InterruptedException e) {

            e.printStackTrace();

        } catch (BrokenBarrierException e) {

            e.printStackTrace();

        }

        

        System.out.println("调用一个公共的业务逻辑方法。。。。");

    }

}

测试主类:

public class TestCyclicBarrierDemo {

    public static void main(String[] args) {

        ExecutorService pool = Executors.newFixedThreadPool(8);

        CyclicBarrier cyclicBarrier = new CyclicBarrier(8);

        for (int i = 0; i < 8; i++) {

            pool.submit((new ThreadTask(cyclicBarrier,i)));

        }

        pool.shutdown();

        

    }

}

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