[CountDownLatch实现等待TcpServer启动完毕后再发射事件]

背景:

        有时候,我们希望NettyServer启动时不能说卡住主线程。

       也不能说:直接就启动一个线程,不然没办法发射出“服务器启动”这个事件。

        这时就可以使用此类执行完毕后,通知下主线程。

1)TcpServer.java

package org.example.testStart;import java.io.IOException;
import java.util.concurrent.CountDownLatch;public class TcpServer extends Thread{// 使用这个在当前线程执行完毕后,立马通知主线程private final CountDownLatch latch;public TcpServer(CountDownLatch latch) {this.latch = latch;}@Overridepublic void run() {try {System.out.println(Thread.currentThread().getName() + " tcpserver start success" );latch.countDown();// 相当于netty等待关闭System.in.read();} catch (IOException e) {e.printStackTrace();}}
}

2)Main.java

package org.example.testStart;import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;public class Main {public static void main(String[] args) throws InterruptedException {regHookThread();System.out.println(Thread.currentThread().getName() + " start!");initTcpServer();initTcpServer();System.out.println(Thread.currentThread().getName() + " end!");// 等待5s,模拟使用jmx关闭服务器TimeUnit.SECONDS.sleep(5);System.exit(1);}public static void initTcpServer() throws InterruptedException {CountDownLatch latch = new CountDownLatch(1);new TcpServer(latch).start();// 等待执行完毕latch.await();}public static void regHookThread() {Runtime.getRuntime().addShutdownHook(new Thread(() -> {System.out.println(Thread.currentThread().getName() + " hook thread finish!");}, "gs-hook-thread"));}
}/*
main start!
Thread-0 tcpserver start success
Thread-1 tcpserver start success
main end!
gs-hook-thread hook thread finish!*/

总结:可以看出来,是单独的线程启动,但是可以控制住顺序了。

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

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

相关文章

投资生涯的核心密码:构建交易逻辑体系

首先,我们需要明确一点,交易中究竟有没有确定性? 确定性是指在某一种形式、或有若干条件时,价格必然会上涨或下跌,也可以决定上涨或下跌的程度。 我认为,没有。迄今为止还没有一个理论能发现即使确定的东西…

Kong 尝试使用JWT Plugin

Plugin的作用范围可以是在路由上也可以是customer上,还可以全局。 步骤 1. 在custom里面点击credentials,在右边选择添加JWT。 2. 填一个key和secret。 3. 用JWT编辑器生成一个token。payload加一个iss:"custom_key",校验的密钥…

alibaba集成的spring cloud组件有哪些?

阿里巴巴提供了一些与Spring Cloud集成的组件,这些组件可以帮助您构建可靠、弹性和高可用的分布式应用程序。以下是一些常用的阿里巴巴与Spring Cloud集成的组件: Alibaba Nacos:Nacos是一个用于服务注册、配置和发现的动态服务发现和配置管理…

python图像处理初步

文章目录 处理流程灰度分布图 处理流程 在Python中,通过【plt】和【numpy】可以实现图像处理的最简单的流程,即读取图片->处理图片->显示结果->保存结果。 import matplotlib.pyplot as plt import numpy as nppath lena.jpg img plt.imrea…

软考论文框架

论文由背景过渡论点论述总结组成 论点论述:有理论和实践组成,说明论点定义、作用项目中对该论点的实际应用进行说明。 能画图就画图,可加分。 双拼论文 以一个主题为主论点,然后在每个主论点中,插入后面主题的论点。 整…

春节医美热,爱美客、昊海生科谁更赚钱?

在颜值经济赛道上,医美项目逐渐成为消费主流。随着春节假期的到来,医美消费又将迎来高峰期。 “医美三剑客”中,爱美客(300896.SZ)、昊海生科(688366.SH)近日相继公布了2023年的业绩报告:2023年,爱美客预计实现净利润…

白敬亭风波后现身,心情低落进新剧组,父母暖心陪伴。

♥ 为方便您进行讨论和分享,同时也为能带给您不一样的参与感。请您在阅读本文之前,点击一下“关注”,非常感谢您的支持! 文 |猴哥聊娱乐 编 辑|徐 婷 校 对|侯欢庭 白敬亭春晚首秀引热议,口碑因“春山学”风波陷两极…

掌握Docker:让你的应用轻松部署和管理

文章目录 一、引言(为什么要学习docker?)1.1 环境不一致1.2 隔离性1.3 弹性伸缩1.4 学习成本 二、Docker介绍2.1 Docker的由来2.2 什么是Docker2.3 为什么要用Docker2.3.1 虚拟机2.3.2 Linux容器 2.4 Docker与传统虚拟机的区别2.5 Docker的思…

微信小程序(四十五)登入界面-简易版

注释很详细,直接上代码 上一篇 此文使用了vant组件库,没有安装配置的可以参考此篇vant组件的安装与配置 新增内容: 1.基础组件的组合 2.验证码倒计时的逻辑处理 源码: app.json {"usingComponents": {"van-field…

打印水仙花数---c语言刷题

欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 题述 求出0~100000之间的所有“水仙花数”并输出。 “水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153&#…

Linux日志文件切割的6种方法

1. logrotate命令 logrotate是linux系统自带的日志文件管理工具,通过配置文件和定时任务配合来实现系统日志文件的管理,如日志周期滚动切割、删除旧日志及生成新日志等。 logrotate的配置文件在/etc/logrotate.conf和/etc/logrotate.d/目录下,配置文件…

C++数据库连接池

功能实现设计 : ConnectionPool.cpp 和 ConnectionPool.h :连接池代码实现 Connection.cpp 和 Connection.h :数据库操作代码、增删改查代码实现 连接池主要包含了以下功能点 : 1.连接池只需要一个实例,所以 Connec…

前端工程化面试题 | 17.精选前端工程化高频面试题

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

高并发系统实战课个人总结(极客时间)

高并发系统实战课 场景 读多写少 我会以占比最高的“读多写少”系统带你入门,梳理和改造用户中心项目。这类系统的优化工作会聚焦于如何通过缓存分担数据库查询压力,所以我们的学习重点就是做好缓存,包括但不限于数据梳理、做数据缓存、加缓…

element-ui中el-scrollbar 滚动到底部

控制el-scrollbar内滚动条的方法与控制页面的滚动条的方法基本一样&#xff0c;只是获取el-scrollbar节点的滚动条时&#xff0c;需使用 refs.scrollMenuRef.wrap /*el-scrollbar 必须指定高度*/ <el-scrollbar refscrollMenuRes stylewidth:100%;height:200px; wrap-style&…

有哪些非常经典的开源项目?

本文从ABCD角度图解这方面内容。 业界把人工智能&#xff08;Artificial Intelligence&#xff09;、区块链&#xff08;Blockchain&#xff09;、云计算&#xff08;Cloud Computing&#xff09;和数据科学&#xff08;Data Science&#xff09;统称的“ABCD”推崇为颇具潜力…

[力扣 Hot100]Day35 LRU 缓存

题目描述 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c;否…

@ControllerAdvice 统一管理异常/错误

ControllerAdvice 统一管理异常/错误 文章目录 ControllerAdvice 统一管理异常/错误一、注意事项二、统一管理异常/错误的好处三、代码实现1. 普通方法2. 统一管理ControllerAdvice3. PostMan测试结果 一、注意事项 1. 如果校验注解不指定 message 属性 ,会返回默认消息, 这些…

编译原理之SLR(1)和语法制导的翻译

1.SLR(1)思想&#xff1a; 基于容许LR(0)规范集中有冲突的项目集&#xff0c;用向前查看一个符号的办法进行处理&#xff0c;解决冲突&#xff0c;因为只对有冲突的状态才查看一个符号&#xff0c;是一种简单的LR(1)分析法&#xff0c;用SLR(1)表示 2.SLR(1)分析的简单方法&a…

ubuntu安装anaconda后出现“conda: command not found”

1. 使用conda 命令时出现“conda: command not found” 原因&#xff1a; ~/.bashrc文件没有配置好 解决方案&#xff1a; vim ~/.bashrc 在最后一行加上 export PATH$PATH:/home/wzg/anaconda3/bin 把上面的“/home/wzg/anaconda3/bin”换成自己的anaconda的安装目录即…