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占用。

sun.misc默认是import不了的,需要在eclipse中设置下:

实例代码

package signals;

import sun.misc.Signal;
import sun.misc.SignalHandler; @SuppressWarnings("restriction")
public class TestSignal implements SignalHandler {
private void signalCallback(Signal sn) {
System.out.println(sn.getName() + "is recevied.");
} @Override
public void handle(Signal signalName) {
signalCallback(signalName);
} public static void main(String[] args) throws InterruptedException {
TestSignal testSignalHandler = new TestSignal();
// install signals
Signal sig = new Signal("USR2");
Signal.handle(sig, testSignalHandler);
Thread.sleep(15000);
}
}

Sun为我们提供了2个方便安装和替换信号处理器的工具类。
sun.misc.Signal
sun.misc.SignalHandler
将上面的代码编译后,运行,会暂停15秒,此时,是你给java进程发送信号最佳时机。
发送信号前,需要先通过ps 或jps 获取java的进程id,然后运行kill -s SIGUSR2 pid如果在java的stdout 看到SIGUSR2 is recevied 字样,说明信号被成功送达了。

在Java编程中使用信号的实际收益信号作为最原始的进程间异步通信手段,有着诸多局限性的,比如不能传递上下文,信号随时都可能被占用导致冲突,不具备扩展性等,所以对功能性需求来说,使用它收益甚微。
当然,信号也不是一无是处,除了用作简单的异步通知外,还可以利用它的进程事件通知功能。
在Java里有一个典型例子,就是ShutdownHook。

OS信号实现Java异步通知的更多相关文章

  1. Socket层实现系列 — 信号驱动的异步等待

    主要内容:Socket的异步通知机制. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 概述 socket上定义了几个IO事件:状态改变事件.有数据可读事 ...

  2. Linux学习 :按键信号 之 异步通知

    一.异步通知概念: 异步通知是指:一旦设备就绪,则主动通知应用程序,应用程序根本就不需要查询设备状态,类似于中断的概念,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的.信号是异步的,一个进 ...

  3. Java中的异步通知

    在我们的日常开发中,经常会遇到这样的问题--"我让你做一件事情,但是你做得很慢,并不能够立马返回给我结果,害我一直在那儿等着你给我返回结果,什么都做不了". 程序是自上而下顺序执行 ...

  4. linux驱动的异步通知(kill_fasync,fasync)---- 驱动程序向应用程序发送信号

    应用程序 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include < ...

  5. java做微信支付notify_url异步通知服务端的写法

    最近团队在接入微信支付,APP和JSAPI的接口都需要填写一个notify_url回调地址,但是坑爹的官方文档并没有找到JSAPI模式的java版的demo,所以不得不自己看文档写了一个接受微信异步通 ...

  6. 嵌入式Linux驱动学习之路(十三)按键驱动-异步通知

    之前的按键方式: 查询: 极度占用CPU资源 中断: 在读的时候产生休眠,在没有信号的时候永远不会返回. poll机制: 在中断的基础上加上超时时间. 异步通知就是通过信号来传送. 首先在应用程序中有 ...

  7. Linux的fasync驱动异步通知详解【转】

    本文转载自:http://blog.csdn.net/coding__madman/article/details/51851338 版权声明:本文为博主原创文章,未经博主允许不得转载. 工作项目用有 ...

  8. 入门级的按键驱动——按键驱动笔记之poll机制-异步通知-同步互斥阻塞-定时器防抖

    文章对应视频的第12课,第5.6.7.8节. 在这之前还有查询方式的驱动编写,中断方式的驱动编写,这篇文章中暂时没有这些类容.但这篇文章是以这些为基础写的,前面的内容有空补上. 按键驱动——按下按键, ...

  9. linux设备驱动归纳总结(三):7.异步通知fasync【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-62725.html linux设备驱动归纳总结(三):7.异步通知fasync xxxxxxxxxxx ...

随机推荐

  1. 链表(list)的实现(c语言)

    链表是一种基本的数据结构,今天练习了一下,所以将代码贴在下面,代码测试通过,代码还可以优化,我会过段时间就会增加一部分或者优化一部分直达代码无法优化为止,我的所有数据结构和算法都会用这样的方式在博客上 ...

  2. 实现checkbox的多选

    checkbox多选 技术一般水平有限,有什么错的地方,望大家指正. 全选,多选都是为了使用的方便,一般情况下全选就够用了,但是用户要求实现一个多选的功能也没有办法老老实实的做吧. 多选的实现也较为简 ...

  3. 快播CEO王欣:流量跌到零也要转型

    曾因免费与快捷而独霸视频播放器行业的快播科技,或许将迎来壮士断腕的艰难时刻. 4月16日晚,快播于新浪微博上先后发布<公告>和<致快播用户书:我们涅槃在即>,表示快播将启动商业 ...

  4. vee-validate 中文配置报错及自定义规则 报错.updateDictionary/.addlocale is not a function

    原因由于vee-validate版本更新的问题导致的. 1. 原因分析: a 新版vee-validate的语言配置方法变化了, Validator.localize('zh_CN', zh_CN) ...

  5. CMS垃圾回收

    最近在学习JVM和GC调优,今天总结下CMS的一些特点和要点,让我们先简单的看下整个堆年轻代和年老代的垃圾收集器组合(以下配合java8完美支持,其他版本可能稍有不同),其中标红线的则是我们今天要着重 ...

  6. Ubuntu 搭建Ghost1.0博客系统

    最近想使用Ghost搭建自己的博客网站,网上搜索了下大多都是1.0之前版本搭建的文章,但是Ghost1.0版本已经可用好一段时间了,所以决定根据官方文档搭建Ghost1.0版本的博客系统. 下面开始一 ...

  7. Pandas 命令整理

    在网上看到一个整理的很好的pandas命令合集,转一份供自己查找与参考

  8. 苹果HomeKit联手海尔的三大原因

    2014已成智能家居元年,无论是资本市场还是巨头企业无不把触角向这一领域延伸.刚有人称,智能家居将成三星和谷歌对决,但不成想,前几天的苹果WWDC大会上,苹果就发布了自家的智能家居平台HomeKit. ...

  9. 在WisOne平台上学习TypeScript

    TypeScript是微软公司推出的开源的类型化脚本语言,目的是用于为弱类型的javaScript提供强类型的识别和感知功能,同时它提供了类.接口.继承等相关在javaScript中不容易实现的功能, ...

  10. jquery deferred promise

    <script type="text/javascript">/* Deferredstate (then,done, fail, always,pipe, progr ...