我有一个工具正在运行,并通过命令提示符中的BAT文件调用。在该工具中,Quartz调度程序定期调用一个执行逻辑的方法。
根据当前实现,所有这些都是通过单个线程完成的,因此即使在BAT文件上执行了CTRL + C,该工具也不会在该过程完成之前关闭。
但是,在查看过程之后,我们提出了在单独的线程中执行部分过程的想法。在这里,主线程将创建一个新线程,这将继续执行一些耗时的操作,而父线程死亡。而且,在子线程结束之前,Quartz可能会启动另一个流程。
因此,一次只能有一个父线程,Quartz创建,但可以有任意数量的子线程运行。
在上面的场景中,如果执行了CTRL + C,那么Quartz调度程序仅在关闭之前等待父线程完成,并且所有其他线程都不完整。
如果有人能告诉我如何在所有线程完成之前保持工具运行,我将非常感激。
提前致谢。
PS:我尝试将新创建的子线程作为关闭挂钩附加,但它似乎无法解决我的问题。也许我做错了,但它至今没有帮助我。
答案 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
主题停止进一步处理(如果需要)。
希望这会对你有所帮助。