Java CountDownLatch应用场景代码实例

 更新时间:2020年09月30日 08:31:06   作者:zapldy  
这篇文章主要介绍了Java CountDownLatch应用场景代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

Java的concurrent包里面的CountDownLatch其实可以把它看作一个计数器,只不过这个计数器的操作是原子操作,同时只能有一个线程去操作这个计数器,也就是同时只能有一个线程去减这个计数器里面的值。

你可以向CountDownLatch对象设置一个初始的数字作为计数值,任何调用这个对象上的await()方法都会阻塞,直到这个计数器的计数值被其他的线程减为0为止。

CountDownLatch的一个非常典型的应用场景是:有一个任务想要往下执行,但必须要等到其他的任务执行完毕后才可以继续往下执行。假如我们这个想要继续往下执行的任务调用一个CountDownLatch对象的await()方法,其他的任务执行完自己的任务后调用同一个CountDownLatch对象上的countDown()方法,这个调用await()方法的任务将一直阻塞等待,直到这个CountDownLatch对象的计数值减到0为止。

举个例子,有三个工人在为老板干活,这个老板有一个习惯,就是当三个工人把一天的活都干完了的时候,他就来检查所有工人所干的活。记住这个条件:三个工人先全部干完活,老板才检查。所以在这里用Java代码设计两个类,Worker代表工人,Boss代表老板,具体的代码实现如下:

Java代码

package org.zapldy.concurrent; 
 
import java.util.Random; 
import java.util.concurrent.CountDownLatch; 
import java.util.concurrent.TimeUnit; 
 
public class Worker implements Runnable{ 
   
  private CountDownLatch downLatch; 
  private String name; 
   
  public Worker(CountDownLatch downLatch, String name){ 
    this.downLatch = downLatch; 
    this.name = name; 
  } 
   
  public void run() { 
    this.doWork(); 
    try{ 
      TimeUnit.SECONDS.sleep(new Random().nextInt(10)); 
    }catch(InterruptedException ie){ 
    } 
    System.out.println(this.name + "活干完了!"); 
    this.downLatch.countDown(); 
     
  } 
   
  private void doWork(){ 
    System.out.println(this.name + "正在干活!"); 
  } 
   
}

Java代码

package org.zapldy.concurrent; 
 
import java.util.concurrent.CountDownLatch; 
 
public class Boss implements Runnable { 
 
  private CountDownLatch downLatch; 
   
  public Boss(CountDownLatch downLatch){ 
    this.downLatch = downLatch; 
  } 
   
  public void run() { 
    System.out.println("老板正在等所有的工人干完活......"); 
    try { 
      this.downLatch.await(); 
    } catch (InterruptedException e) { 
    } 
    System.out.println("工人活都干完了,老板开始检查了!"); 
  } 
 
} 

Java代码

package org.zapldy.concurrent;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CountDownLatchDemo {

	public static void main(String[] args) {
		ExecutorService executor = Executors.newCachedThreadPool();
		
		CountDownLatch latch = new CountDownLatch(3);
		
		Worker w1 = new Worker(latch,"张三");
		Worker w2 = new Worker(latch,"李四");
		Worker w3 = new Worker(latch,"王二");
		
		Boss boss = new Boss(latch);
		
		executor.execute(w3);
		executor.execute(w2);
		executor.execute(w1);
		executor.execute(boss);
		
		executor.shutdown();
	}

}

当你运行CountDownLatchDemo这个对象的时候,你会发现是等所有的工人都干完了活,老板才来检查,下面是我本地机器上运行的一次结果,可以肯定的每次运行的结果可能与下面不一样,但老板检查永远是在后面的。

王二正在干活!
李四正在干活!
老板正在等所有的工人干完活......
张三正在干活!
张三活干完了!
王二活干完了!
李四活干完了!
工人活都干完了,老板开始检查了!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java使用@Autowired注解获取对象为null的几种情况及解决方法

    Java使用@Autowired注解获取对象为null的几种情况及解决方法

    这篇文章主要给大家介绍了使用@Autowired注解获取对象为null的几种情况以及 解决方法,文中有详细的代码示例讲解,具有一定的参考价值,需要的朋友可以参考下
    2023-09-09
  • Spring boot admin 服务监控利器详解

    Spring boot admin 服务监控利器详解

    这篇文章主要介绍了Spring boot admin 服务监控利器详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • 深入理解Java中1是true0是false

    深入理解Java中1是true0是false

    Java中,1可以被看作是true,0可以被看作是false,本文就来进行详细的讲解,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • Java进阶之高并发核心Selector详解

    Java进阶之高并发核心Selector详解

    前几篇文章介绍了Java高并发的一些基础内容,认识了Channel,Buffer和Selector的基本用法,有了感性认识之后,来看看Selector的底层是如何实现的。,需要的朋友可以参考下
    2021-05-05
  • Java8通过Function获取字段名的方法(获取实体类的字段名称)

    Java8通过Function获取字段名的方法(获取实体类的字段名称)

    Java8通过Function获取字段名。不用再硬编码,效果类似于mybatis-plus的LambdaQueryWrapper,对Java8通过Function获取字段名相关知识感兴趣的朋友一起看看吧
    2021-09-09
  • Java实现定时任务的方法详解

    Java实现定时任务的方法详解

    大家都用过闹钟,闹钟可以说是一种定时任务。那么,在 Java 中,如何实现这样的功能呢?即如何实现定时任务呢?本文就来详细和大家聊聊
    2022-10-10
  • Java中System.setProperty()用法与实际应用场景

    Java中System.setProperty()用法与实际应用场景

    System.setProperty是Java中用于设置系统属性的方法,它允许我们在运行时为Java虚拟机(JVM)或应用程序设置一些全局的系统属性,下面这篇文章主要给大家介绍了关于Java中System.setProperty()用法与实际应用场景的相关资料,需要的朋友可以参考下
    2024-04-04
  • 使用java8的方法引用替换硬编码的示例代码

    使用java8的方法引用替换硬编码的示例代码

    这篇文章主要介绍了使用java8的方法引用替换硬编码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • java compareTo和compare方法比较详解

    java compareTo和compare方法比较详解

    这篇文章主要介绍了java compareTo和compare方法比较详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • 详解如何在Elasticsearch中搜索空值

    详解如何在Elasticsearch中搜索空值

    这篇文章主要为大家介绍了如何在Elasticsearch中搜索空值的方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01

最新评论