Java Signal实例

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();
		}
	}

	/**
	 * 
	 */
	@Override
	public void update(Observable arg0, Object arg1) {

		System.out.println("Received signal: " + arg1);
	}

	/**
	 * HandlerTest Class
	 */
	class HandlerTest extends Observable implements SignalHandler {

		@Override
		public 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值