gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:05:14 25 4
gpt4 key购买 nike

我有以下程序结构

我的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() 附加到每个启动的线程?

最佳答案

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

A shutdown hook is simply an initialized but unstarted thread. When the virtual machine begins its shutdown sequence it will start all registered shutdown hooks in some unspecified order and let them run concurrently.

这只是在 JVM 关闭时又启动了一个线程。当然,您可以根据需要创建任意数量的 shutdownhook,但它们都将等待 JVM 关闭,而它无法实现您需要的行为。如果您仍然需要运行它,那么只需获取运行时并注册一个新线程即可:

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

但是,如果您需要在某个线程完成执行后运行一些逻辑,那么您需要其他解决方案。在线程实现中甚至可以是简单的 try-finally。

而且,不要太依赖它,你的 JVM 可以在没有执行 shutdownhook 的情况下停止。更重要的是,它并没有真正卡住 JVM 关闭进程,这意味着您的 JVM 可以在未完成 shutdownhook 逻辑的情况下停止。

关于java - 如何在多线程程序中附加 addShutdownHook(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33032851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com