Latch(门阀)设计模式

    Latch设计模式指定了一个屏障,只有所有条件满足时,门阀才能打开。Latch的作用是为了等待所有子任务完成后再执行其他任务。CountDownLatch的await超时的时候,已经完成的任务正常结束,未按时完成的任务不会被中断,还会继续执行,它不提供线程管理方面的支持。

示例代码:

import java.util.concurrent.TimeUnit;public abstract class Latch {
protected int limit;public Latch(int limit) {
this.limit=limit;
}public abstract void await() throws InterruptedException;
public abstract void await(TimeUnit unit,long time) throws InterruptedException,WaitTimeoutException;
public abstract void countDown();
public abstract int getUnarrived();
}
import java.util.concurrent.TimeUnit;public class CountDownLatch extends Latch{public CountDownLatch(int limit) {
super(limit);
}@Override
public void await() throws InterruptedException {
synchronized(this) {
while(limit>0) {
this.wait();
}
}
}@Override
public void countDown() {
synchronized(this) {
if(limit<=0) {
throw new IllegalStateException("all of task already arrived");
}
limit--;
this.notifyAll();
}
}@Override
public int getUnarrived() {
return limit;
}@Override
public void await(TimeUnit unit, long time) throws InterruptedException, WaitTimeoutException {
if(time<=0) {
throw new IllegalArgumentException("The time is invalid");
}
long remainNanos=unit.toNanos(time);
final long endNanos=System.nanoTime()+remainNanos;
synchronized(this) {
while(limit>0) {
if(TimeUnit.NANOSECONDS.toMillis(remainNanos)<=0) {
throw new WaitTimeoutException("The wait time over specify time.");
}
this.wait(TimeUnit.NANOSECONDS.toMillis(remainNanos));
remainNanos=endNanos-System.nanoTime();
}
}
}}
public class WaitTimeoutException extends Exception{
public WaitTimeoutException(String message) {
super(message);
}
}
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;public class ProgrammerTravel extends Thread{
private final Latch latch;
private final String programmer;
private final String transportation;public ProgrammerTravel(Latch latch,String programmer,String transportation) {
this.latch=latch;
this.programmer=programmer;
this.transportation=transportation;
}@Override
public void run() {
System.out.println(programmer+" start take the transportation["+transportation+"]");
try {
TimeUnit.SECONDS.sleep(ThreadLocalRandom.current().nextInt(0, 10));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(programmer+" arrived by "+transportation);
latch.countDown();
}}
import java.util.concurrent.TimeUnit;public class LatchTest {public static void main(String[] args) throws InterruptedException, WaitTimeoutException {
Latch latch=new CountDownLatch(4);
new ProgrammerTravel(latch,"Alex","Bus").start();
new ProgrammerTravel(latch,"Bee","Walking").start();
new ProgrammerTravel(latch,"Charlie","Subway").start();
new ProgrammerTravel(latch,"Digo","Bicycle").start();
latch.await(TimeUnit.SECONDS,5);
System.out.println("==== all programmer arrived ====");
}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/221601.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode 51 N 皇后

题意理解&#xff1a; N皇后问题指的是在一个nn的棋盘上&#xff0c;防止皇后棋子&#xff0c;每行、每列、每45斜角只能有一个皇后存在。 这是一道困难的题&#xff1a;困难在于&#xff1a; 如何处理棋盘&#xff0c;如何表示棋子。 将期盼看作是2维数组&#xff0c;一行一行…

JS冒泡排序

想必大家都多多少少了解过一点排序&#xff0c;让我为大家介绍一下冒泡排序吧&#xff01; 假设我们现在有一个数组[2&#xff0c;4&#xff0c;3&#xff0c;5&#xff0c;1] 我们来分析一下&#xff1a; 1.一共需要的趟数 我们用外层for循环 5个数据我们一共需要走4躺 长度就…

关东升老师极简系列丛书(由清华大学出版社出版)

极简系列丛书&#xff0c;编程学习新体验 在这个科技日新月异的时代&#xff0c;编程已经成为了一种必备技能。但是面对各种复杂的编程语言&#xff0c;你是否也曾感到过迷茫和困惑&#xff1f;由清华大学出版社出版的“极简系列丛书”就是为了帮助你解决这个问题。 这套丛书…

解决nuxt3引入图片报错:ReferenceError: require is not defined

现象&#xff1a; 原因&#xff1a;在nuxt3中不支持require的方式引入图片/文件等静态资源。 解决办法&#xff1a; 1. 直接在img标签中的src属性里写明图片的路径&#xff0c;但是此时src前面不能有冒号做动态绑定&#xff01;&#xff1a; src"/assets/images/loading…

【为什么POI的SXSSFWorkbook占用内存更小?】

&#x1f513;为什么POI的SXSSFWorkbook占用内存更小&#xff1f; &#x1f3c6;POI的SXSSFWorkbook&#x1f3c6;POI的SXSSFWorkbook占用内存&#x1f3c6;扩展配置行缓存限制 &#x1f3c6;POI的SXSSFWorkbook SXSSFWorkbook类是Apache POI库的一部分&#xff0c;它是一个流…

【论文阅读】LoRA: Low-Rank Adaptation of Large Language Models

code&#xff1a;GitHub - microsoft/LoRA: Code for loralib, an implementation of "LoRA: Low-Rank Adaptation of Large Language Models" 做法&#xff1a; 把预训练LLMs里面的参数权重给冻结&#xff1b;向transformer架构中的每一层&#xff0c;注入可训练的…

STM32 LCD 简单显示彩色图片

STM32 LCD 数组方式简单显示彩色图片 文章目录 STM32 LCD 数组方式简单显示彩色图片前言1、图片处理1.1 准备图片1.2 查看和调整图片大小 2、Picture2Hex软件使用3、函数代码实现3、图片显示效果4、显示图片太大会报错总结 前言 在使用LCD填充的时候发现正点原子提供了一个很好…

力扣labuladong一刷day38天扁平化嵌套列表迭代器

力扣labuladong一刷day38天扁平化嵌套列表迭代器 一、341. 扁平化嵌套列表迭代器 题目链接&#xff1a;https://leetcode.cn/problems/flatten-nested-list-iterator/description/ 思路&#xff1a;本题是一个嵌套列表&#xff0c;如果一次性全部给拉平迭代到一维占用的内存可…

用于解释非目标代谢组学数据的集成深度学习框架

摘要 非定向代谢组学正获得广泛应用。数据分析的关键方面包括建模代谢网络的复杂活动、选择与临床结果相关的代谢物以及发现关键代谢途径以揭示生物学机制。数据分析中的一个关键障碍未得到很好解决&#xff0c;即数据特征与已知代谢物之间的匹配不确定性问题。鉴于实验技术的…

字符雨canvas

整体思路&#xff1a; 确定好字符雨的具体字符是什么&#xff0c;需要多少行多少列这里是写死的其实也可以用循环加随机的方式生成不一样的字符雨&#xff0c;行列也可以读一下宽度然后做一下出发算一下也行首先得有一张画布搞起&#xff0c;然后循环列数去绘画字符定时器循环…

【MySQL】主键、唯一键和外键

文章目录 主键唯一键外键 主键 作用&#xff1a; 在一个table中&#xff0c;标识一行记录的唯一性。 语法&#xff1a; create table时&#xff0c;可以紧随列属性声明的后面&#xff0c;如id int primary key &#xff0c;也可以单独成一行&#xff0c;如下&#xff1a; …

获取Java类路径

利用System.getProperty(“java.class.path”)可以获取Java类路径&#xff08;Java class path&#xff09;。 package com.thb;import java.io.IOException;public class Test5 {public static void main(String[] args) throws IOException {System.out.println(System.getP…

【活动回顾】Databend 云数仓与 Databend Playground 扩展组件介绍

2023 年 12 月 7 日&#xff0c;作为 KubeSphere 的合作伙伴&#xff0c;Databend 荣幸地受邀参与了 KubeSphere 社区主办的云原生技术直播活动。本次活动的核心议题为「Databend 云数仓与 Databend Playground 扩展组件介绍」&#xff0c;此次分享由 Databend Labs 的研发工程…

大数据笔记(待续)

mysql 缓存技术 数据库和缓存双写数据一致性问题常见的解决方案 常见方案通常情况下&#xff0c;我们使用缓存的主要目的是为了提升查询的性能。大多数情况下&#xff0c;我们是这样使用缓存的&#xff1a; 用户请求过来之后&#xff0c;先查缓存有没有数据&#xff0c;如果有…

getResource()方法的使用以及路径问题

getResource()方法是Class类中的一个获取文件的方法&#xff0c;我在使用该方法稍微不注意经常会出现如下报错 Exception in thread "main" java.lang.NullPointerException 因此我觉得还是有必要写一篇博客来梳理以下该方法的误区、盲点。 首先getResource()方法可…

基于SSM的便民自行车管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

人工智能与VR技术

人工智能与虚拟现实技术&#xff08;VR&#xff09;的结合是当今科技领域中备受瞩目的话题。两者的结合不仅在娱乐、教育、医疗等领域展现出了巨大的潜力&#xff0c;而且在未来的发展趋势中也将具有重要意义。本文将从技术融合、应用场景和未来发展等方面探讨人工智能与虚拟现…

基于JAVA+SpringBoot+微信小程序的宠物领养平台

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着人们生活水平的提…

系列十五、Redis面试题集锦

一、Redis面试题集锦 1.1、Redis到底是单线程还是多线程 Redis6.0版本之前的单线程指的是其网络IO和键值对读写是由一个线程完成的&#xff1b; Redis6.0引入的多线程指的是网络请求过程采用了多线程&#xff0c;而键值对读写命令仍然是单线程的&#xff0c;所以多线程环境下&…

Leetcode.75 颜色分类【荷兰国旗问题】

荷兰国旗问题 荷兰国旗问题是一个经典的计算机科学问题&#xff0c;它来源于荷兰国旗的颜色分布&#xff0c;荷兰国旗自上而下由红、白、蓝三个水平条组成。在算法领域&#xff0c;这个问题通常用于描述一种分类问题&#xff0c;其中元素只有三种类型&#xff08;通常用三种颜…