本文将结合操做系统的信号机制,来尝试实现一个简单的,不依赖功能环境的Java异步通知功能。 没有特殊说明,本文全部的示例,都是基于Linux。异步
信号简介信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求能够说是同样的。 通俗来说,信号就是进程间的一种异步通讯机制。ide
典型的例子: kill -s SIGKILL pid (即kill -9 pid) 当即杀死指定pid的进程。 在上面这个例子中,SIGKILL就是往pid进程发送的信号。google
信号及其效果列表 http://docs.google.com/View?id=dtbhrmv_754gh86rcg4操作系统
平台相关性信号具备平台相关性,不一样平台下能使用的信号种类是有差别的。rest
在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, BREAKget
信号选择为了避免干扰正常信号的运做,又能模拟Java异步通知,咱们须要先选定一种特殊的信号。 经过查看信号列表上的描述,发现 SIGUSR1 和 SIGUSR2 是容许用户自定义的信号。 那么选择它们,理论上就不会影响正常功能了。io
这里我选用了USR2做为传递信号。缘由是USR1有可能已被其余APP占用。class
实例代码 import sun.misc.Signal; import sun.misc.SignalHandler; /** * Java Signal Test * @author Ken Wu * */ @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); } } import sun.misc.Signal; import sun.misc.SignalHandler; /** * [...]