如何在多线程程序中附加addShutdownHook()

时间:2015-10-09 07:52:25

标签: java multithreading

我有以下程序结构

My Main.java

public class Main
{    
    public static void main(String[] args)
    {
        Database db = new Database();
        int totalNumberOfThreads = 0;
        Thread newThread = null;

        try
        {
                for (int i = 0; i < numberOfThreads; i++)
                {
                    System.out.println("Starting autorsponder!");
                    newThread = new Thread(new AutoresponderHtml());

                    UncaughtExceptionHandler handler = new UncaughtExceptionHandler()
                    {
                        @Override
                        public void uncaughtException(Thread t, Throwable ex)
                        {
                            FileOutputStream fos = null;
                            try
                            {
                                fos = new FileOutputStream(new File("throwable.txt"), true);
                            }
                            catch (FileNotFoundException e)
                            {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                            PrintStream ps = new PrintStream(fos);
                            ex.printStackTrace(ps);
                        }
                    };

                    newThread.setName(threadName);
                    newThread.setUncaughtExceptionHandler(handler);
                    newThread.start();
                }
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        System.out.println("Main ended");

    }
}

我的AutoresponderHtml.java类

public class AutoresponderHtml extends Common implements Runnable
{
    @Override
    public void run()
    {
    }
}

如何将addShutdownHook()附加到每个启动的线程?

2 个答案:

答案 0 :(得分:1)

您不必将ShutdownHook附加到您启动的每个线程,尤其是因为它不可能。由于documentation

  

关闭钩子只是一个初始化但未启动的线程。当虚拟机开始其关闭序列时,它将以某种未指定的顺序启动所有已注册的关闭挂钩,并让它们同时运行。

只有一个Thread启动,而JVM正在关闭。当然,你可以按照自己的意愿制作尽可能多的关机挂钩,但是它们都将等待JVM关闭,它不能满足您的需要。如果你仍然需要它运行,那么只需获取运行时并注册一个新线程:

Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() {
         //your logic here
    }
});

但是如果你需要一些逻辑在一些线程完成执行后运行,那么你需要一些其他的解决方案。可能是简单的尝试 - 最后在线程实现。

此外,不要过分依赖它,你的JVM可以在没有执行shutdownhook的情况下停止。更重要的是,它并没有真正冻结JVM关闭过程,这意味着你的JVM可以在没有完成shutdownhook ligic的情况下停止。

答案 1 :(得分:0)

来自public void addShutdownHook(Thread hook)

  

关闭钩子只是一个初始化但未启动的线程。当虚拟机开始其关闭序列时,它将以某种未指定的顺序启动所有已注册的关闭挂钩,并让它们同时运行。当所有挂钩都完成后,如果启用了finalization-on-exit,它将运行所有未读取的终结器。最后,虚拟机将停止。请注意,守护程序线程将在关闭序列期间继续运行,如果通过调用exit方法启动关闭,则非守护程序线程将继续运行。

意味着您可以提供一些未启动的线程,这些线程将在虚拟机开始关闭序列时运行。

在此处查看示例Runtime.addShutdownHook()