Java骚操作之CountDownLatch代码详解
作者:Java Pro 发布时间:2023-01-17 11:14:41
标签: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秒
方法描述
来源:https://blog.csdn.net/Fine_Cui/article/details/107144502


猜你喜欢
- Gson是一个Java库,用来实现Json和Java对象之间的相互转换。Gson是一个托管在https://github.com/googl
- 二维(多维)vector添加一个空项今天刷Leecode,需要创建一个二维vector,vector<vector < int
- 今天给大家介绍一下SpringBoot中JPA的一些常用操作,例如:增删改查、分页、排序、事务操作等功能。下面先来介绍一下JPA中一些常用的
- 这篇文章主要介绍了Java调用明华RF读写器DLL文件过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- listview实现上拉加载以及下拉刷新的方式有很多。下面是我写的一种自定义的布局,复用性也比较的强。首先就是继承的listview的自定义
- MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力。如果你有使用 JDBC 或其他 相似框架的经验,你就明白条件地串联 SQL
- yaml语法注解配置文件两种形式application.properties和.yaml第一种语法 key=value第二种key:空格va
- 没有接触过音乐字幕方面知识的话,会对字幕的实现比较迷茫,什么时候转到下一句?看了这篇文章,你就会明白字幕so easy。先来一张效果图:字幕
- 一、java多线程基本入门java多线程编程还是比较重要的,在实际业务开发中经常要遇到这个问题。 java多线程,传统创建线程的方式有两种。
- 本文实例讲述了WPF中不规则窗体与WindowsFormsHost控件兼容问题的解决方法。分享给大家供大家参考。具体方法如下:这里首先说明一
- C#可以直接引用C++的DLL和转换JAVA写好的程序。最近由于工作原因接触这方面比较多,根据实际需求,我们通过一个具体例子把一个JAVA方
- 本文实例为大家分享了flutter实现底部不规则导航栏的具体代码,供大家参考,具体内容如下scafford的bottomNavigation
- 部署到webapps目录启动本文使用的Spring版本为Spring6,SpringBoot版本为3,JDK为17,可能会和之前有细微不同,
- 最近碰到这么个恶心的问题问题:有个arr文件被放到Module A中引用,现在Module B又依赖了Module A,则在编译过程中会发生
- 一、Thread 类了解如何使用Thread 类实现多线程之后,继续学习Thread 类实现多线程之后的相关功能及方法。1、操作线程名称的方
- 前言本文主要讲述如何使用Java + FFmpeg实现对视频文件的信息提取、码率压缩、分辨率转换等功能;之前在网上浏览了一大圈Java使用F
- 一、Flow的基本概念Kotlin 的 Flow 相信大家都或多或少使用过,毕竟目前比较火,目前我把Flow的使用整理了一下。希望和大家所学
- 在Android中通过ListView显示SD卡中的文件列表一共有两种方法,一是:通过继承ListActivity显示;二是:利用BaseA
- Spring Boot 自动配置来看下 spring boot中自动配置的注解@SuppressWarnings("depreca
- 一、使用注解实现自定义映射关系当POJO属性名与数据库列名不一致时,需要自定义实体类和结果集的映射关系,在MyBatis注解开发中,使用 @