Java Signal实例

来源:互联网 发布:好用的国货护肤品知乎 编辑:程序博客网 时间:2024/05/18 15:06

TimYang在博文《降低应用latency方法谈》中提到对Java方法进行Profiling,在某些场景更倾向于采用纯Java工具类的方法,比如通过给进程发Signals来实现,以求动态地打开或关闭Profiler。

 

感觉这个思路不错,以下是一个大致实例:

 

SignalTest.java

 

/** *  */package signal;import java.util.Observable;import java.util.Observer;import sun.misc.Signal;import sun.misc.SignalHandler;/** * @author xuanyin *  */public class SignalTest implements Observer {/** * @param args */public static void main(String[] args) {new SignalTest().go();}private void go() {try {HandlerTest sh = new HandlerTest();sh.addObserver(this);sh.handleSignal("HUP");sh.handleSignal("BUS");System.out.println("Sleeping for 60 seconds: hit me with signals!");Thread.sleep(60000);} catch (Throwable x) {x.printStackTrace();}}/** *  */@Overridepublic void update(Observable arg0, Object arg1) {System.out.println("Received signal: " + arg1);}/** * HandlerTest Class */class HandlerTest extends Observable implements SignalHandler {@Overridepublic void handle(Signal signal) {setChanged();notifyObservers(signal);}/** *  * @param signalName * @throws IllegalArgumentException */public void handleSignal(String signalName) throws IllegalArgumentException {try {Signal.handle(new Signal(signalName), this);} catch (IllegalArgumentException x) {throw x;} catch (Throwable x) {throw new IllegalArgumentException("Signal unsupported: "+signalName, x);}}}}

 

首先运行执行上述程序,然后查看其系统进程号。

如,若是4089,则在终端中执行kill -s BUS 4089

Java程序输出:Received signal: SIGBUS

 

信号具有平台相关性,不同平台下能使用的信号种类是有差异的。

 

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

 

不足之处欢迎大家留言指正:)

 

0 0
原创粉丝点击