基于OS信号实现Java异步通知
本文将结合操作系统的信号机制,来尝试实现一个简单的,不依赖功能环境的Java异步通知功能。
没有特殊说明,本文所有的示例,都是基于Linux。
信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。
通俗来讲,信号就是进程间的一种异步通信机制。
典型的例子:
kill -s SIGKILL pid (即kill -9 pid) 立即杀死指定pid的进程。
在上面这个例子中,SIGKILL就是往pid进程发送的信号。
信号及其效果列表
http://docs.google.com/View?id=dtbhrmv_754gh86rcg4
信号具有平台相关性,不同平台下能使用的信号种类是有差异的。
在Linux下支持的信号(对比信号列表查看描述)
SEGV, ILL, FPE, BUS, SYS, CPU, FSZ, ABRT, INT, TERM, HUP, USR1, USR2, QUIT, BREAK, TRAP, PIPE
在Windows下支持的信号
SEGV, ILL, FPE, ABRT, INT, TERM, BREAK
为了不干扰正常信号的运作,又能模拟Java异步通知,我们需要先选定一种特殊的信号。
通过查看信号列表上的描述,发现 SIGUSR1 和 SIGUSR2 是允许用户自定义的信号。
那么选择它们,理论上就不会影响正常功能了。
这里我选用了USR2作为传递信号。原因是USR1有可能已被其他APP占用。
实例代码_/ Java Signal Test @author Ken Wu_**
*/
@SuppressWarnings(“restriction”)
public class TestSignal implements SignalHandler {
}
Sun为我们提供了2个方便安装和替换信号处理器的工具类。
sun.misc.Signal
sun.misc.SignalHandler
将上面的代码编译后,运行,会暂停15秒,此时,是你给java进程发送信号最佳时机。
发送信号前,需要先通过 ps 或 jps 获取java的进程id,然后运行
信号作为最原始的进程间异步通信手段,有着诸多局限性的,比如不能传递上下文,信号随时都可能被占用导致冲突,不具备扩展性等,所以对功能性需求来说,使用它收益甚微。
当然,信号也不是一无是处,除了用作简单的异步通知外,还可以利用它的进程事件通知功能。
在Java里有一个典型例子,就是 ShutdownHook。
本文来源于"阿里中间件团队播客",原文发表时间" 2011-03-15"
珠联壁合地设天造|M1 Mac os(Apple Silicon)基于vscode(arm64)配置搭建Java开发环境(集成web框架Springboot) 也许有人从未听说过Python,但是不会有人没听说过Java,它作为一个拥有悠久历史的老牌编程语言,常年雄踞TIOBE编程语言榜首,其顶尖的霸主地位不可撼动,而M1 mac业已发布了一段时间,作为跨时代的顶级芯片系统,这两大巨头能否珠联璧合,让开发者们猛虎添翼、更上层楼?本次我们尝试在M1 mac系统中搭建Java开发环境,并且集成目前Web开发领域红的发紫的Springboot框架,另外,谁说玩儿Java就必须得用Eclipse或者IntelliJ IDEA?我们就骄傲地使用Vscode。
【Java开发工具】下载安装eclipse并中文配置教程(所以操作系统通用) 汉化渠道 去eclipse官网选择汉化链接:https://download.eclipse.org/technology/babel/update-site/R0.19.2/2021-12/ 这里给你们提供了!
Java获取客户端操作系统类型-HTTP请求头User-Agent 项目部署之后,通过代码获取的系统参数均为服务端的系统环境,并不能直接获取到客户端的系统参数。因此需要利用**HttpServletRequest**获取到请求头,其中**User-Agent**包含了浏览器信息,并且可以获取到操作系统的相关信息。
相关文章
- [Java基础] java的守护线程与非守护线程
- Hibernate中使用Criteria查询及注解——(Emp.java)
- java错误:The superclass "javax.servlet.http.HttpServlet" was not found on the Java Bu
- Java反射异常:java.lang.NoSuchFieldException
- Java实现 LeetCode 738 单调递增的数字(暴力)
- Java实现 LeetCode 387 字符串中的第一个唯一字符
- Java实现 LeetCode 76 最小覆盖子串
- Java实现第八届蓝桥杯购物单
- Java实现 蓝桥杯VIP 算法训练 一元三次方程
- Java实现算法提高十进制数转八进制数
- Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
- Java通过mysql-connector-java-8.0.11连接MySQL Server 8.0遇到的几个问题
- c语言中的scanf在java中应该怎么表达,Scanner类。
- java 11 标准Java异步HTTP客户端
- 【JAVA】java中char类型数组用数组名打印结果不是地址值而是数组内容
- 【JAVA】 04-Java中的多线程
- java.lang.OutOfMemoryError: Java heap space 解决方法
- java 11 标准Java异步HTTP客户端
- 【JAVA】MacBook安装Java环境及eclipse
- 【JAVA】Java 异常中e的getMessage()和toString()方法的异同
- 【JAVA】java中的length和length()
- 【JAVA】 01-Java基础知识
- Atitit web httphandler的实现 java python node.js c# net php 目录 1.1. Java 过滤器 servelet1 1.2. Python的
- Atitit java播放器调音速率快慢的实现 目录 1.1. 原理 本质上是改变采样率即可1 2. 使用Java增加/降低AudioInputStream的音频播放速度(Increase/dec
- 当年的java考试:Java景区预约登记管理系统(maven整合servlet)
- 【Java】java中javaSE与javaEE的区别
- java死锁(Java-level deadlock)
- java非阻塞NIO和阻塞IO
- Mac OS 安装 java JDK
- JAVA语言之Java 中不同的并行实现的性能比较
- 【JAVA面试必会】JMM高并发详解(java内存模型、JMM三大特征、volatile关键字 )
- Android 把java文件从一个目录到另一个目录下的父类文件提示:红色波浪线
- 【java】Java 重写(Override)与重载(Overload)
- JAVA开发讲义(二)-Java程序设计之数据之谜一