当前位置: 首页 > 编程笔记 >

Java骚操作之CountDownLatch代码详解

孔硕
2023-03-14
本文向大家介绍Java骚操作之CountDownLatch代码详解,包括了Java骚操作之CountDownLatch代码详解的使用技巧和注意事项,需要的朋友参考一下

简述

用来干嘛的?当你在方法中调用了多个线程,对数据库进行了一些不为人知的操作后,还有一个操作需要留到前者都执行完的重头戏,就需要用到 CountDownLatch 了

实践代码

package com.github.gleans;

import java.util.concurrent.CountDownLatch;

public class TestCountDownLatch {

  public static void main(String[] args) throws InterruptedException {
    CountDownLatch latch = new CountDownLatch(3);
    new KeyPass(1000L, "thin jack", latch).start();
    new KeyPass(2000L, "noral jack", latch).start();
    new KeyPass(3000L, "fat jack", latch).start();
    latch.await();
    System.out.println("此处对数据库进行最后的插入操作~");
  }

  static class KeyPass extends Thread {

    private long times;

    private CountDownLatch countDownLatch;

    public KeyPass(long times, String name, CountDownLatch countDownLatch) {
      super(name);
      this.times = times;
      this.countDownLatch = countDownLatch;
    }

    @Override
    public void run() {
      try {
        System.out.println("操作人:" + Thread.currentThread().getName()
            + "对数据库进行插入,持续时间:" + this.times / 1000 + "秒");
        Thread.sleep(times);
        countDownLatch.countDown();
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
}

图解

使用await()提前结束操作

package com.github.gleans;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

public class TestCountDownLatch {

  public static void main(String[] args) throws InterruptedException {
    CountDownLatch latch = new CountDownLatch(3);
    new KeyPass(2000L, "公司一", latch).start();
    new KeyPass(3000L, "公司二", latch).start();
    new KeyPass(5000L, "公司三", latch).start();
    latch.await(2, TimeUnit.SECONDS);
    System.out.println("~~~贾总PPT巡演~~~~");
    System.out.println("~~~~融资完成,撒花~~~~");
  }

  static class KeyPass extends Thread {

    private long times;

    private CountDownLatch countDownLatch;

    public KeyPass(long times, String name, CountDownLatch countDownLatch) {
      super(name);
      this.times = times;
      this.countDownLatch = countDownLatch;
    }

    @Override
    public void run() {
      try {
        Thread.sleep(times);
        System.out.println("负责人:" + Thread.currentThread().getName()
            + "开始工作,持续时间:" + this.times / 1000 + "秒");
        countDownLatch.countDown();
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
}

假设公司一、公司二、公司三各需要2s、3s、5s来完成工作,贾总等不了,只能等2s,那么就设置await的超时时间

latch.await(2, TimeUnit.SECONDS);

执行结果

负责人:公司一开始工作,持续时间:2秒
~~~贾总PPT巡演~~~~
~~~~融资完成,撒花~~~~
负责人:公司二开始工作,持续时间:3秒
负责人:公司三开始工作,持续时间:5秒

方法描述

总结

这个操作可以说是简单好用,目前还未遇见副作用,若是有大佬,可以告知弟弟一下,提前表示感谢~

到此这篇关于Java骚操作之CountDownLatch的文章就介绍到这了,更多相关Java CountDownLatch内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!

 类似资料:
  • 本文向大家介绍java安全编码指南之:Number操作详解,包括了java安全编码指南之:Number操作详解的使用技巧和注意事项,需要的朋友参考一下 简介 java中可以被称为Number的有byte,short,int,long,float,double和char,我们在使用这些Nubmer的过程中,需要注意些什么内容呢?一起来看看吧。 Number的范围 每种Number类型都有它的范围,我

  • 本文向大家介绍在Java中操作Zookeeper的示例代码详解,包括了在Java中操作Zookeeper的示例代码详解的使用技巧和注意事项,需要的朋友参考一下 依赖 连接到zkServer 检测节点是否存在 操作后,服务端会返回处理结果,返回void、null也算处理结果。 同步指的是当前线程阻塞,等待服务端返回数据,收到返回的数据才继续往下执行; 异步回调指的是,把对结果(返回的数据)的处理写在

  • 本文向大家介绍代码详解JS操作剪贴板,包括了代码详解JS操作剪贴板的使用技巧和注意事项,需要的朋友参考一下 javascript可以轻松操作客户端剪贴板内容,不过只适用IE5以上浏览器。 javascript可以使用window.clipboardData对象处理剪贴板内容。 保存到剪贴板的方法setData(param1, param2)。 param1 :数据类型 text 或 URL等。 p

  • 本文向大家介绍Java中CountDownLatch进行多线程同步详解及实例代码,包括了Java中CountDownLatch进行多线程同步详解及实例代码的使用技巧和注意事项,需要的朋友参考一下 Java中CountDownLatch进行多线程同步详解 CountDownLatch介绍 在前面的Java学习笔记中,总结了Java中进行多线程同步的几个方法: 1、synchronized关键字进行同

  • 本文向大家介绍Java CountDownLatch应用场景代码实例,包括了Java CountDownLatch应用场景代码实例的使用技巧和注意事项,需要的朋友参考一下 Java的concurrent包里面的CountDownLatch其实可以把它看作一个计数器,只不过这个计数器的操作是原子操作,同时只能有一个线程去操作这个计数器,也就是同时只能有一个线程去减这个计数器里面的值。 你可以向Cou

  • 本文向大家介绍Java并发系列之CountDownLatch源码分析,包括了Java并发系列之CountDownLatch源码分析的使用技巧和注意事项,需要的朋友参考一下 CountDownLatch(闭锁)是一个很有用的工具类,利用它我们可以拦截一个或多个线程使其在某个条件成熟后再执行。它的内部提供了一个计数器,在构造闭锁时必须指定计数器的初始值,且计数器的初始值必须大于0。另外它还提供了一个c