免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 11282 | 回复: 2
打印 上一主题 下一主题

java SignalHandler 信号处理问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-02-25 11:46 |只看该作者 |倒序浏览
  1. public class Outdb extends Thread implements SignalHandler {
  2.          ....................
  3.          省略变量声明
  4.       ....................

  5.          private void signalCallback(Signal sn) {
  6.         System.out.println(sn.getName() + "is recevied.");
  7.         System.out.println("-----------------------------");
  8.         System.out.println("SINGAL:" + Thread.activeCount());
  9.         System.exit(0);
  10.     }

  11.     public void run() {
  12.         System.out.println("-----------------------------");
  13.         System.out.println("addShutdownHook run:" + Thread.activeCount());
  14.         appExit();
  15.     }
  16.    

  17.    
  18.     /**
  19.      * @重写信号处理函数
  20.      * @说明:当接收信号时调用调用信号处理函数
  21.      * @Date : 2010-02-01
  22.      * @param: 注册信号名称
  23.      */
  24.     public void handle(Signal signalName) {
  25.         signalCallback(signalName);
  26.         // Chain back to previous handler, if one exists
  27.         if (oldHandler != SIG_DFL && oldHandler != SIG_IGN) {
  28.             System.out.println("another signal received , Chain back!");
  29.             oldHandler.handle(signalName);
  30.         }

  31.     }

  32.     /**
  33.      * @Main 主函数
  34.      * @Date : 2010-02-01
  35.      * @param: param 程序调用参数数组
  36.      */
  37.     public static void main(String param[]) throws Exception {
  38.         Outdb doit = new Outdb();

  39.         Runtime.getRuntime().addShutdownHook(doit);
  40.         Signal sigTERM = new Signal("TERM");/* 注册KILL信号 */
  41.         Signal sigINT = new Signal("INT");/* 注册CTRL+C信号 */
  42.         doit.oldHandler = Signal.handle(sigTERM, doit);
  43.         doit.oldHandler = Signal.handle(sigINT, doit);
  44.             .........
  45.              以下为业务主流程
  46.             .........

  47.           }

  48.           /**
  49.          * @正常退出处理函数
  50.          * @Date : 2010-02-01
  51.          * @param: 无
  52.          */

  53.         private void appExit() {
  54.                 /* 临时文件改名 */
  55.                 if (vSaveDir != null && new File(vSaveDir).exists()) {
  56.                         dealTempFile(STATUS);
  57.                 }
  58.                 /* 锁文件删除 */
  59.                 if (LOCKFILE != null) {
  60.                         LOCKFILE.delete();
  61.                 }
  62.                 try {
  63.                         if (database != null) {
  64.                                 if (STATUS) {
  65.                                         debug("Exit normally....");
  66.                                         database.Commit();
  67.                                 } else {
  68.                                         debug("Exit abnormally....");
  69.                                         database.Rollback();
  70.                                 }
  71.                                 database.Close();
  72.                         }
  73.                                 } catch (Exception e) {
  74.                         writeLog("appExit():" + e.getMessage(), 1);
  75.                 }
  76.         }

  77. }
复制代码
程序主要用SignalHandler进行信号监听,信号处理方法signalCallback中进行执行退出;
同时Runtime.getRuntime().addShutdownHook(doit);注册了程序退出处理函数;
但是在程序执行过程中,当收到CTRL+C信号之后,虽然执行了信号处理函数和退出处理函数,但是Main主线程
没有立刻停止,还是会继续运行。

请教各位,如何控制当接收到信号之后将让MAIN主线程停止运行?

论坛徽章:
0
2 [报告]
发表于 2010-02-25 12:44 |只看该作者
怎么没人帮忙啊。。。

论坛徽章:
0
3 [报告]
发表于 2010-02-27 21:42 |只看该作者
阻塞在了appExit()上
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP