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

来源:互联网 发布:新手模拟钢琴软件 编辑:程序博客网 时间:2024/05/19 19:16
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 程序向下执行。
    实例:
 
  1. public class CountDownLatchDemo {  
  2.     final static SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  3.     public static void main(String[] args) throws InterruptedException {  
  4.         CountDownLatch latch=new CountDownLatch(2);//两个工人的协作  
  5.         Worker worker1=new Worker("zhang san"5000, latch);  
  6.         Worker worker2=new Worker("li si"8000, latch);  
  7.         worker1.start();//  
  8.         worker2.start();//  
  9.         latch.await();//等待所有工人完成工作  
  10.         System.out.println("all work done at "+sdf.format(new Date()));  
  11.     }  
  12.       
  13.       
  14.     static class Worker extends Thread{  
  15.         String workerName;   
  16.         int workTime;  
  17.         CountDownLatch latch;  
  18.         public Worker(String workerName ,int workTime ,CountDownLatch latch){  
  19.              this.workerName=workerName;  
  20.              this.workTime=workTime;  
  21.              this.latch=latch;  
  22.         }  
  23.         public void run(){  
  24.             System.out.println("Worker "+workerName+" do work begin at "+sdf.format(new Date()));  
  25.             doWork();//工作了  
  26.             System.out.println("Worker "+workerName+" do work complete at "+sdf.format(new Date()));  
  27.             latch.countDown();//工人完成工作,计数器减一  
  28.   
  29.         }  
  30.           
  31.         private void doWork(){  
  32.             try {  
  33.                 Thread.sleep(workTime);  
  34.             } catch (InterruptedException e) {  
  35.                 e.printStackTrace();  
  36.             }  
  37.         }  
  38.     }  
  39.       
  40.        

输出:

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

}



       


0 0
原创粉丝点击