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

时间:2011-05-03 06:15:45

标签: java quartz-scheduler

我有一个工具正在运行,并通过命令提示符中的BAT文件调用。在该工具中,Quartz调度程序定期调用一个执行逻辑的方法。

根据当前实现,所有这些都是通过单个线程完成的,因此即使在BAT文件上执行了CTRL + C,该工具也不会在该过程完成之前关闭。

但是,在查看过程之后,我们提出了在单独的线程中执行部分过程的想法。在这里,主线程将创建一个新线程,这将继续执行一些耗时的操作,而父线程死亡。而且,在子线程结束之前,Quartz可能会启动另一个流程。

因此,一次只能有一个父线程,Quartz创建,但可以有任意数量的子线程运行。

在上面的场景中,如果执行了CTRL + C,那么Quartz调度程序仅在关闭之前等待父线程完成,并且所有其他线程都不完整。

如果有人能告诉我如何在所有线程完成之前保持工具运行,我将非常感激。

提前致谢。

PS:我尝试将新创建的子线程作为关闭挂钩附加,但它似乎无法解决我的问题。也许我做错了,但它至今没有帮助我。

2 个答案:

答案 0 :(得分:3)

子线程不应该是守护线程(Thread.setDaemon(false)),因此它们将使JVM保持活动状态。

如果它们不是守护程序线程,您可以等待它们全部终止:
- 使用Thread.join()等待一个线程 - 通过传递相同的CountDownLatch(n)实例等待n个线程;完成工作后,每个子线程都会对其进行countDown();父线程应在其上await()

答案 1 :(得分:-1)

你是如何使用ShutdownHook的? (我已将此功能用于同一目的,它对我来说工作正常) 看看这个Link(Useful Example of 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主题停止进一步处理(如果需要)。 希望这会对你有所帮助。