zoukankan      html  css  js  c++  java
  • Java 提升之CountDownLatch

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

    主要方法

     public CountDownLatch(int count);

     public void countDown();

     public void await() throws InterruptedException
     

    构造方法参数指定了计数的次数

    countDown方法,当前线程调用此方法,则计数减一

    awaint方法,调用此方法会一直阻塞当前线程,直到计时器的值为0

    package com.study.thread.concurrent;
    
    import java.util.Random;
    import java.util.concurrent.CountDownLatch;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    /**
     * @author draem0507
     * @TODO 学下countdownLatch
     * @version 0.1
     * @create 2012 15:03:28
     * 
     */
    public class CountDownLatchTest {
        /**
         * <p>
         * CountDownLatch类是一个同步计数器,构造时传入int参数,
         * </p>
         * <p>
         * 该参数就是计数器的初始值,每调用一次countDown()方法,计数器减1,
         * </p>
         * <p>
         * 计数器大于0 时,await()方法会阻塞程序继续执行
         * </p>
         */
    
        public static void main(String[] args) {
    
            CountDownLatch countDownLatch = new CountDownLatch(3);
            Worker worker1 = new Worker("小明", countDownLatch);
            Worker worker2 = new Worker("小红", countDownLatch);
            Worker worker3 = new Worker("小强", countDownLatch);
            Boss boss = new Boss(countDownLatch);
            ExecutorService service = Executors.newCachedThreadPool();
            service.execute(worker1);
            service.execute(worker2);
            service.execute(worker3);
            service.execute(boss);
            service.shutdown();
    
        }
    }
    
    class Worker implements Runnable {
        private String name;
        private CountDownLatch countDownLatch;
    
        public void run() {
            doWork();
            try {
                Thread.sleep((new Random().nextInt(10)) * 1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(name + "-->结束干活");
            countDownLatch.countDown();
    
        }
    
        public Worker(String name, CountDownLatch countDownLatch) {
    
            this.name = name;
            this.countDownLatch = countDownLatch;
        }
    
        private void doWork() {
    
            System.out.println(name + "-->正在干活");
        }
    }
    
    class Boss implements Runnable {
        private CountDownLatch countDownLatch;
    
        public Boss(CountDownLatch countDownLatch) {
    
            this.countDownLatch = countDownLatch;
        }
    
        public void run() {
            System.out.println("老板正在等待验工");
    
            try {
                countDownLatch.await();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("工人干活都结束,老板开始验工");
        }
    }

    结果:

    小明-->正在干活
    小红-->正在干活
    老板正在等待验工
    小强-->正在干活
    小强-->结束干活
    小明-->结束干活
    小红-->结束干活
    工人干活都结束,老板开始验工

    不一定都按上述结果呈现,但是最后一句话肯定是最后执行

    参考:

      http://www.cnblogs.com/yezhenhan/archive/2012/01/07/2315652.html

      http://www.iteye.com/topic/1002652

  • 相关阅读:
    SqlCeConnectionBeginTransaction 方法
    父子继承窗体,子窗体视图无法正常打开,解决办法
    Windows Mobile 如何和模拟器关联有用的URL
    Windows Mobile 6.5.3 Developer Tool Kit
    通过Eclipse import导入项目,並重新命名Project
    【杂】Oracle使用记录:分区表及执行计划
    实践 2-0 selenium使用的一些总结
    实践2-1 python连接Oracle数据库
    【杂】word文件加密和压缩加密
    【杂】HIVE使用记录:回收站及从回收站恢复分区表
  • 原文地址:https://www.cnblogs.com/draem0507/p/2831072.html
Copyright © 2011-2022 走看看