リフレクションによって特定の 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 を起動すると、プラグインごとに個別のスレッドが作成されますか? もしそうなら、これらは彼らでしょうか?ご意見をお聞かせください。