繁体   English   中英

如何在所有线程完成之前保持 JVM 处于活动状态?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM