`

捕获用户按键"Ctrl+C"

阅读更多
  在Console下,用户按下Ctrl+C后,进程就会收到相应的中断信号(Signal). 然后,该进程就会作手处理(或默认不处理)。

  下面,看看Java中怎么处理用户按下Ctrl+C(linux下 kill -15 pid也可).

	public static void hookBySignal(){
		  SignalHandler handler = new SignalHandler(){
			public void handle(Signal sig) { 
				System.out.println("hooking shutdown signal");
			} };
			Signal.handle(new Signal("INT"),handler);
			//hook ctrl+c
			Signal.handle(new Signal("TERM"),handler);
			//hook alt+f4 
	}


备注: 上面是引用sun.misc Package下的Class,非Sun的JVM,可能就不适用。


再来看看Jetty 是怎么处理这类的?
/* ------------------------------------------------------------ */
    /* ------------------------------------------------------------ */
    /* ------------------------------------------------------------ */
    /**
     * ShutdownHook thread for stopping all servers.
     * 
     * Thread is hooked first time list of servers is changed.
     */
    private static class ShutdownHookThread extends Thread
    {
        private boolean hooked = false;
        private ArrayList servers = new ArrayList();

        /**
         * Hooks this thread for shutdown.
         * 
         * @see java.lang.Runtime#addShutdownHook(java.lang.Thread)
         */
        private void createShutdownHook()
        {
            if (!Boolean.getBoolean("JETTY_NO_SHUTDOWN_HOOK") && !hooked)
            {
                try
                {
                    Method shutdownHook = java.lang.Runtime.class.getMethod("addShutdownHook", new Class[]
                    { java.lang.Thread.class});
                    shutdownHook.invoke(Runtime.getRuntime(), new Object[]
                    { this});
                    this.hooked = true;
                }
                catch (Exception e)
                {
                    if (Log.isDebugEnabled())
                        Log.debug("No shutdown hook in JVM ", e);
                }
            }
        }

        /**
         * Add Server to servers list.
         */
        public boolean add(Server server)
        {
            createShutdownHook();
            return this.servers.add(server);
        }

        /**
         * Contains Server in servers list?
         */
        public boolean contains(Server server)
        {
            return this.servers.contains(server);
        }

        /**
         * Append all Servers from Collection
         */
        public boolean addAll(Collection c)
        {
            createShutdownHook();
            return this.servers.addAll(c);
        }

        /**
         * Clear list of Servers.
         */
        public void clear()
        {
            createShutdownHook();
            this.servers.clear();
        }

        /**
         * Remove Server from list.
         */
        public boolean remove(Server server)
        {
            createShutdownHook();
            return this.servers.remove(server);
        }

        /**
         * Remove all Servers in Collection from list.
         */
        public boolean removeAll(Collection c)
        {
            createShutdownHook();
            return this.servers.removeAll(c);
        }

        /**
         * Stop all Servers in list.
         */
        public void run()
        {
            setName("Shutdown");
            Log.info("Shutdown hook executing");
            Iterator it = servers.iterator();
            while (it.hasNext())
            {
                Server svr = (Server) it.next();
                if (svr == null)
                    continue;
                try
                {
                    svr.stop();
                }
                catch (Exception e)
                {
                    Log.warn(e);
                }
                Log.info("Shutdown hook complete");

                // Try to avoid JVM crash
                try
                {
                    Thread.sleep(1000);
                }
                catch (Exception e)
                {
                    Log.warn(e);
                }
            }
        }
    }
	


注意到他为什么要使用反射,而不直接使用java.lang.Runtime.addShutdownHook ?
仔细想一下,应该主要是考虑到jdk版本兼容问题(低版本1.2.2下不被支持)。


再贴上java.lang.Runtime#addShutdownHook的注释
0
0
分享到:
评论

相关推荐

    易语言控制台Ctrl+C源码

    当用户按下Ctrl+C时,`获取控制台输入`函数会返回3(Ctrl+C的ASCII码),程序就会捕获到这个事件并执行相应的退出操作。如果没有按下Ctrl+C,程序则会打印出用户输入的字符。 通过这种方式,易语言初学者可以学习...

    Qt捕获组合按键实现

    qt的键盘事件不能捕获多个按键按...即便是在使用modifiers()时,也只能获得类似于shfit+x,ctrl+c,alt+y等等之类的快捷键,对于shift+x+c诸如此类更多的组合就无能为力的.本案例中提供了一种捕获shift+a+b...组合键的方法

    易语言控制台Ctrl+C源码-易语言

    在这个特定的场景中,我们关注的是“易语言控制台Ctrl+C源码”,这通常指的是在易语言环境下,如何捕获并响应用户在控制台按下Ctrl+C这一键盘组合键的程序代码。 在大多数编程环境中,Ctrl+C是一个常用的中断信号,...

    电脑各种快捷键.pdf

    电脑快捷键是用于简化操作、提高效率的一系列按键组合。它们广泛应用于操作系统、浏览器、文本编辑器和其他软件中,使用户能够不使用鼠标,仅通过键盘快速执行常用命令。 F5: 通常用于刷新或更新当前窗口的内容。在...

    微软模拟飞行10键盘按键说明.pdf

    * 退出飞行模拟:CTRL + C * 立即退出飞行模拟:CTRL + BREAK 飞机控制面指令(CONTROL SURFACE COMMANDS) * 副翼左倾斜:数字键盘 4 * 副翼右倾斜:数字键盘 6 * 副翼左配平:CTRL + 数字键盘 4 * 副翼右配平:...

    Ctrl-Shift-C-Should-Copy:潜在的Firefox扩展程序,可拦截Ctrl + Shift + C,阻止打开开发人员工具并将所选内容复制到剪贴板

    通过捕获Ctrl + Shift + C的按键组合,我们可以防止默认行为的发生,即不打开开发者工具。然后,扩展程序会利用`document.execCommand('copy')`命令将当前选中的内容复制到剪贴板,实现了预期的复制功能。 在实现这...

    eclipse快捷键.txt

    3. **复制**: `Ctrl + C` - 复制选中的文本或元素。 4. **剪切**: `Ctrl + X` - 剪切选中的文本或元素。 5. **粘贴**: `Ctrl + V` - 将剪贴板中的内容粘贴到当前位置。 6. **撤销**: `Ctrl + Z` - 撤销上一步操作。 ...

    UNIX环境高级编程源代码

    5. **信号**:信号是进程间通信的一种方式,用于通知进程发生了某些事件,如SIGINT(中断)用于捕获用户按键Ctrl+C,SIGTERM(终止)用于请求程序优雅退出。 6. **线程**:多线程编程在UNIX环境中通常通过pthread库...

    键盘上每个键作用键盘上每个键作用

    - **CTRL + C**: 复制所选内容。 - **CTRL + X**: 剪切所选内容。 - **CTRL + V**: 粘贴剪贴板中的内容。 - **CTRL + Z**: 撤销上一步操作。 - **CTRL + O**: 打开文件对话框,用于选择并打开文件。 - **SHIFT + ...

    电脑快捷键大全知识点.pdf

    - Ctrl + C:复制选中的项目。 - Ctrl + V:粘贴复制的项目。 - Ctrl + X:剪切选中的项目。 - Ctrl + Z:撤销操作。 - Ctrl + S:保存当前工作。 - Ctrl + O:打开文件。 - Ctrl + F:打开搜索框。 - Ctrl + P:...

    抛弃鼠标_全键盘操作电脑

    - `Ctrl + C`:复制选中的文本或对象。 - `Ctrl + V`:粘贴已复制的文本或对象。 - `Ctrl + Z`:撤销上一步操作。 - `Ctrl + A`:全选当前文档中的内容。 4. **文本编辑**: - `Ctrl + B`:加粗文字。 - `...

    电脑高手常用的65个按钮

    - **Ctrl + C / Ctrl + X / Ctrl + V**:分别用于复制、剪切和粘贴所选内容。 - **Ctrl + Z**:撤销上一步操作,对于误操作后的恢复至关重要。 - **Ctrl + O**:打开文件,是编辑软件中常见的快捷键。 - **Ctrl + S*...

    键盘上每个键作用!!! (史上最全的)

    - **CTRL + C**: 复制选中的文本或对象。 - **CTRL + X**: 剪切选中的文本或对象。 - **CTRL + V**: 粘贴复制或剪切的内容。 - **CTRL + Z**: 撤销最近的操作。 - **CTRL + O**: 打开文件或项目。 - **CTRL + F4**: ...

    按键精灵讲解及教程

    在录制过程中,执行特定的操作,例如:在表格中使用Ctrl+C复制关键词,这将被按键精灵捕获并添加到脚本中。接着,导航到Excel,通过点击下拉菜单中的三角形,选择相应的选项,这个过程也会被记录。 然后,我们使用...

    电脑技巧之键盘功能键

    #### 剪切、复制与粘贴:Ctrl+C, Ctrl+X, Ctrl+V - **Ctrl+C**:用于复制选定的内容。无论是文本、图片还是文件,只需选中目标,按下此组合键即可快速复制。 - **Ctrl+X**:执行剪切操作,即将选定的内容从原位置...

    对话框程序响应组合按键.rar

    对话框(Dialog Box)是用户界面的重要组成部分,它提供了一种与用户交互的方式,而组合按键(Combination Keys)如Ctrl+C、Ctrl+V等则是提高用户效率的快捷方式。在这个“对话框程序响应组合按键”的项目中,我们将...

    笔记本电脑快捷键大全.pdf

    - Ctrl+C:复制选定项。 - Ctrl+V:粘贴剪切或复制的内容。 3. Alt键快捷键: - Alt+F4:关闭当前程序。 - Alt+Tab:切换到下一个打开的应用程序。 - Alt+Esc:按程序打开顺序循环切换窗口。 - Alt+F:打开...

    按键替换器(替换系统任意按键)v1.0.zip

    按键替换器的工作就是捕获这些原始的按键信号,然后根据用户预设的规则,将特定的按键映射为其他按键或组合,从而改变原本的输入行为。例如,你可以设置将“A”键替换为“B”键,或者将“Ctrl+C”快捷键替换为“Ctrl...

    易语言按键模块

    例如,Ctrl+C用于复制,Ctrl+V用于粘贴。在易语言中,开始输入热键的函数允许程序员注册一个热键,当用户按下设定的组合键时,程序会接收到相应的信号并执行相应的代码。 “键盘钩子回调”是另一种重要的技术,它...

    快捷键操作.txt[WINDOWS XP]

    4. **Ctrl+V**:粘贴剪贴板上的内容到当前位置,通常与Ctrl+C或Ctrl+X配合使用。 5. **Ctrl+Z**:撤销上一步操作,这是非常实用的功能,可以快速恢复因误操作而修改的内容。 6. **Ctrl+A**:全选当前窗口中的所有...

Global site tag (gtag.js) - Google Analytics