我有以下程序结构
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()附加到每个启动的线程?
答案 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()