3

リフレクションによって特定の jar を起動する procrun を使用してサービスを作成しました。サービスが開始されると、スレッドが開始され、残りの実行はそのスレッドで行われます。次に、各プラグインが独自のスレッドをロードし、そこで実行を行います。

サービスの停止中に、プラグインの停止メソッドを呼び出しました。これらのメソッドが返され、私が作成したプラグインのスレッドが終了しました。しかし、その後も次のスレッドはまだ実行されています。

        INFO: Thread No:0 = Timer-0
        Jan 13, 2016 10:49:58 AM com.test.desktop.SdkMain stop
        INFO: Thread No:1 = WebSocketWorker-14
        Jan 13, 2016 10:49:58 AM com.test.desktop.SdkMain stop
        INFO: Thread No:2 = WebSocketWorker-15
        Jan 13, 2016 10:49:58 AM com.test.desktop.SdkMain stop
        INFO: Thread No:3 = WebSocketWorker-16
        Jan 13, 2016 10:49:58 AM com.test.desktop.SdkMain stop
        INFO: Thread No:4 = WebSocketWorker-17
        Jan 13, 2016 10:49:58 AM com.kube.desktop.KubeSdkMain stop
        INFO: Thread No:5 = WebsocketSelector18
        Jan 13, 2016 10:49:58 AM com.test.desktop.SdkMain stop
        INFO: Thread No:6 = AWT-EventQueue-0
        Jan 13, 2016 10:49:58 AM com.test.desktop.SdkMain stop
        INFO: Thread No:7 = DestroyJavaVM
        Jan 13, 2016 10:49:58 AM com.test.desktop.SdkMain stop
        INFO: Thread No:8 = Thread-11
        Jan 13, 2016 10:49:58 AM com.test.desktop.SdkMain stop

以下は、これらのスレッドを印刷する方法です。

ThreadGroup currentGroup = Thread.currentThread().getThreadGroup();
        int noThreads = currentGroup.activeCount();
        Thread[] lstThreads = new Thread[noThreads];
        currentGroup.enumerate(lstThreads);
        for (int i = 0; i < noThreads; i++)
            LOGGER.log(Level.INFO, "Thread No:" + i + " = " + lstThreads[i].getName());

これらのスレッドが原因で、サービスを停止すると、永遠に時間がかかり、タイムアウトになります。しかし、 System.exit(0) を呼び出すと、サービスがすぐに停止します。これらのスレッドを取り除くにはどうすればよいですか? リフレクションを通じて jar を起動すると、プラグインごとに個別のスレッドが作成されますか? もしそうなら、これらは彼らでしょうか?ご意見をお聞かせください。

4

1 に答える 1