- 论坛徽章:
- 0
|
- public class Outdb extends Thread implements SignalHandler {
- ....................
- 省略变量声明
- ....................
- private void signalCallback(Signal sn) {
- System.out.println(sn.getName() + "is recevied.");
- System.out.println("-----------------------------");
- System.out.println("SINGAL:" + Thread.activeCount());
- System.exit(0);
- }
- public void run() {
- System.out.println("-----------------------------");
- System.out.println("addShutdownHook run:" + Thread.activeCount());
- appExit();
- }
-
-
- /**
- * @重写信号处理函数
- * @说明:当接收信号时调用调用信号处理函数
- * @Date : 2010-02-01
- * @param: 注册信号名称
- */
- public void handle(Signal signalName) {
- signalCallback(signalName);
- // Chain back to previous handler, if one exists
- if (oldHandler != SIG_DFL && oldHandler != SIG_IGN) {
- System.out.println("another signal received , Chain back!");
- oldHandler.handle(signalName);
- }
- }
- /**
- * @Main 主函数
- * @Date : 2010-02-01
- * @param: param 程序调用参数数组
- */
- public static void main(String param[]) throws Exception {
- Outdb doit = new Outdb();
- Runtime.getRuntime().addShutdownHook(doit);
- Signal sigTERM = new Signal("TERM");/* 注册KILL信号 */
- Signal sigINT = new Signal("INT");/* 注册CTRL+C信号 */
- doit.oldHandler = Signal.handle(sigTERM, doit);
- doit.oldHandler = Signal.handle(sigINT, doit);
- .........
- 以下为业务主流程
- .........
- }
- /**
- * @正常退出处理函数
- * @Date : 2010-02-01
- * @param: 无
- */
- private void appExit() {
- /* 临时文件改名 */
- if (vSaveDir != null && new File(vSaveDir).exists()) {
- dealTempFile(STATUS);
- }
- /* 锁文件删除 */
- if (LOCKFILE != null) {
- LOCKFILE.delete();
- }
- try {
- if (database != null) {
- if (STATUS) {
- debug("Exit normally....");
- database.Commit();
- } else {
- debug("Exit abnormally....");
- database.Rollback();
- }
- database.Close();
- }
- } catch (Exception e) {
- writeLog("appExit():" + e.getMessage(), 1);
- }
- }
- }
复制代码 程序主要用SignalHandler进行信号监听,信号处理方法signalCallback中进行执行退出;
同时Runtime.getRuntime().addShutdownHook(doit);注册了程序退出处理函数;
但是在程序执行过程中,当收到CTRL+C信号之后,虽然执行了信号处理函数和退出处理函数,但是Main主线程
没有立刻停止,还是会继续运行。
请教各位,如何控制当接收到信号之后将让MAIN主线程停止运行? |
|