基於OS信號實現Java異步通知

 

本文將結合操做系統的信號機制,來嘗試實現一個簡單的,不依賴功能環境的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;   /**  * [...]
相關文章
相關標籤/搜索