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

实例代码

 

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;   /**  * [...]

转载于:https://my.oschina.net/javagg/blog/3229

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值