簡體   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