`
wangym
  • 浏览: 123341 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java Signal实例

    博客分类:
  • Java
 
阅读更多

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

 

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

 

3
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics