사용자 버튼 캡 처 "Ctrl + C"

5410 단어 자바threadC++cC#
  Console 에서 사용자 가 Ctrl + C 를 누 르 면 프로 세 스 가 중단 신호 (Signal) 를 받 습 니 다. 그리고 이 프로 세 스 는 손 으로 처리 합 니 다 (또는 기본적으로 처리 하지 않 습 니 다).
  다음은 자바 에서 사용 자 를 어떻게 처리 하 는 지 보 겠 습 니 다. Ctrl + C (Liux 에서 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);
                }
            }
        }
    }
	

그 가 왜 반 사 를 사용 하고 자바. lang. Runtime. addShutdownHook 을 직접 사용 하지 않 는 지 알 수 있 습 니까?
곰 곰 이 생각해 보면 jdk 버 전 호환성 문제 (낮은 버 전 1.2.2 에서 지원 되 지 않 음) 를 고려 해 야 합 니 다.
자바. lang. Runtime\# addShutdown Hook 의 주석 를 붙 입 니 다.

좋은 웹페이지 즐겨찾기