我使用procrun创建了一个服务,通过反射启动特定的JAR文件。当服务启动时,它会启动一个线程,并在该线程中执行其余操作。然后每个插件加载自己的线程并在其中执行操作。
在服务停止期间,我调用了插件的stop方法。这些方法已经返回,我创建的任何线程都已终止。但即使在此之后,以下线程仍在运行。
以下是我打印这些线程的方式。
由于这些线程,当我停止服务时,它需要很长时间,然后超时。但是当我调用System.exit(0)时,服务能够快速停止。我该怎么做才能摆脱这些线程?当我通过反射启动JAR文件时,是否为每个插件创建了单独的线程?如果是,这些可能是它们吗?请给些建议。
在服务停止期间,我调用了插件的stop方法。这些方法已经返回,我创建的任何线程都已终止。但即使在此之后,以下线程仍在运行。
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文件时,是否为每个插件创建了单独的线程?如果是,这些可能是它们吗?请给些建议。