[英]Should all these default threads be Running? And do they keep my JVM alive?
[英]How Keep JVM Alive Until All Threads Are Completed?
我有一个正在运行的工具,并通过命令提示符中的 BAT 文件调用。 在该工具中,Quartz 调度程序定期调用一个方法,该方法执行逻辑。
根据当前的实现,所有这些都是通过单个线程完成的,因此即使对 BAT 文件执行 CTRL+C,该工具也不会在进程完成之前关闭。
但是,在查看了流程之后,我们想到了在单独的线程中执行部分流程的想法。 在这里,主线程将创建一个新线程,该线程将在 go 上执行一些耗时的操作,而父线程则死亡。 甚至在子线程结束之前,Quartz 可能会启动另一个流程。
因此,一次只能有一个 Quartz 创建的父线程,但可以有任意数量的子线程在运行。
在上述场景中,如果执行 CTRL+C,那么 Quartz 调度器只等待父线程完成后才会关闭,其他所有线程都处于未完成状态。
如果有人能告诉我如何在所有线程完成之前保持工具运行,我将不胜感激。
提前致谢。
PS:我尝试将新创建的子线程附加为关闭挂钩,但这似乎并没有解决我的问题。 也许我做错了,但它还没有帮助我。
子线程不应是守护线程(Thread.setDaemon(false))
,因此它们将使 JVM 保持活动状态。
如果它们不是守护线程,您可以等待它们全部终止:
- 使用 Thread.join() 等待一个线程
- 通过传递相同的CountDownLatch(n)
实例来等待 n 个线程; 每个子线程在完成工作后都会对其执行countDown()
; 父线程应该在它上面做await()
你是如何使用 ShutdownHook 的? (我已经将这个功能用于同样的目的,它对我来说工作得很好)看看这个链接(ShutdownHook 的有用示例)
这是伪代码。 (它只是为了基本的理解......你的实际实现会比这复杂得多)
public class MyClass implements Runnable
{
public static void main(String[] args)
{
public static boolean isRunning = false;
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
while(isRunning)
Thread.sleep(100);
}
});
Thread t= new Thread (new MyClass());
}
public void run(){
isRunning = true;
//Do your all work
isRunning = false;
}
}
我会建议添加 ShutdownHook 与其他方式(例如 Thread.join() 或创建用户线程等)进行比较,因为这将为您提供适当的控制。 此外,通过 Shutdownhook,您可以通知您的worker
线程停止进一步处理(如果需要)。 希望这会帮助你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.