zoukankan      html  css  js  c++  java
  • Java中关于CountDownLatch的使用

    CyclicBarrier工具类主要是控制多个线程的一起执行,演示程序:

    import java.util.Random;
    import java.util.concurrent.CountDownLatch;
    /**
    * 
    * CyclicBarrier和CountDownLatch功能类似,都可以用作在所有线程都做好准备(比如赛跑:
    * 每一个运动员可以认为是一个线程,只有当所有运动员做好准备才能鸣枪开始跑)之后一起触发运行。 <br>
    * <br>
    * 但是也有区别:<br>
    * 1:CountDownLatch(初始值为线程个数)需要每当一个线程准备好之后,调用一下countDown方法,告诉CountDownLatch又有一个线程已经完成准备,当CountDownLatch值为0时候则触发所有线程一起执行<br>
    * 2:CyclicBarrier(初始值为线程个数)需要每当一个线程准备好之后运行时候会阻塞在await处,当所有线程都阻塞在await处时候,即可触发所有线程执行。(CyclicBarrier:可以循环使用,每当触发完毕一次之后还可以
    * 再次使用该CyclicBarrier的实例对象)
    */
    public class CountDownLatchDemo {
    
    public static void main(String[] args) throws Exception {
    
    CountDownLatch c = new CountDownLatch(3);
    Thread t1 = newThread("t1", c);
    Thread t2 = newThread("t2", c);
    Thread t3 = newThread("t3", c);
    t1.start();
    t2.start();
    t3.start();
    
    System.out.println("线程启动完毕!");
    
    // 下面工作模拟线程的一些自资源初始化
    
    // 模拟线程1资源初始化
    int time = new Random().nextInt(5);
    System.out.println(" sleep " + time + "秒 。");
    Thread.sleep(time * 1000);
    c.countDown(); //到此线程1初始化完毕
    
    // 模拟线程2资源初始化
    time = new Random().nextInt(5);
    System.out.println(" sleep " + time + "秒 。");
    Thread.sleep(time * 1000);
    c.countDown();//到此线程2初始化完毕
    // 模拟线程3资源初始化
    time = new Random().nextInt(5);
    System.out.println(" sleep " + time + "秒 。");
    Thread.sleep(time * 1000);
    c.countDown();//到此线程3初始化完毕
    
    // 所有资源都准备完毕,触发三个线程执行
    
    }
    
    public static Thread newThread(final String threadName, final CountDownLatch c) {
    
    return new Thread(new Runnable() {
    
    @Override
    public void run() {
    try {
    
    c.await();
    System.out.println(threadName + " is running .");
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    
    }
    }, threadName);
    }
    
    }
  • 相关阅读:
    filp_open/filp_close/vfs_read/vfs_write
    memcpy一种实现方法
    memset函数的实现&printf函数几种输出格式的输出结果
    break退出循环分析
    定义指针变量作为返回值函数执行时报 段错误(核心已转储)
    node实现防盗链
    js实现输入密码之延迟星号和点击按钮显示或隐藏
    rem适配
    使用字蛛教程以及遇到的bug
    es6学习笔记-proxy对象
  • 原文地址:https://www.cnblogs.com/leodaxin/p/7653201.html
Copyright © 2011-2022 走看看