我有一个扩展Thread类的类,如下所示。
public class RemoteDataSynchTaskProcessor extends Thread {
private GDRType taskGDR;
public RemoteDataSynchTaskProcessor(GDRType taskGDR) {
this.taskGDR = taskGDR;
}
private void execute() {
try {
try {
RemoteClient.runDataSynchTask(taskGDR);
} catch (RemoteException re) {
//.....
} catch (NotBoundException e) {
//......
}
processResult(false, "Success");
} catch (DTSException de) {
//....
}
}
public void run() {
Observer.incrementNumOfDataSyncyProcessor();
try {
execute();
} finally {
Observer.decrementNumOfDataSynchProcessor();
}
}
此线程执行结束后,出现另一个名为Thread的线程[pool-34-thread-1](正在运行)
我不知道为什么这个线程会出现并且永远不会终止,并且在每次使用池数增加的几天之后我会得到数千个线程(例如Thread [pool-2500-thread-1])
如果调试并暂停执行这些生成的线程,则堆栈如下:
Thread [pool-1-thread-1] (Suspended)
Unsafe.park(boolean, long) line: not available [native method]
LockSupport.park(Object) line: 156
AbstractQueuedSynchronizer$ConditionObject.await() line: 1987
LinkedBlockingQueue<E>.take() line: 399
ThreadPoolExecutor.getTask() line: 947
ThreadPoolExecutor$Worker.run() line: 907
Thread.run() line: 662
这些主题是什么,我怎样摆脱它们?
编辑:好像它与我正在使用的闭源线程池lib有关(通过询问有关执行程序服务的评论来判断)。
我使用提供ThreadPool功能的库。这就是我在应用程序启动时创建池的方法。
ThreadPool fetcherPool = new ThreadPool("TASK_FETCHER", ConfigParams.minimumTaskFetcherCount, ConfigParams.maximumTaskFetcherCount, new TaskFetcher());
ThreadPool.java似乎是在扩展Java的ThreadGroup类,而ThreadFetcher如下所示,它实际上触发了线程。
public class TaskFetcher extends PooledMessageWorker //Pooled Message Worker extends ReacreatableThread
public void run() {
Observer.incrementNumOfTaskFetcher();
try {
while (true) {
try {
if (Observer.isShutdowned()) {
break;
}
ControllerUtil.getInstance().waitIfPaused();
ESDRType task = (ESDRType) TaskHandler.getTask();
if (task != null) {
trigger(task);
}
} catch (Exception e) {
LogUtil.error(logger, e.getMessage(), e);
}
}
} finally {
Observer.decrementNumOfTaskFetcher();
}
}
private void trigger(ESDRType task) {
try {
GDRType[] messages = createMessages(esdr);
for (GDRType message : messages) {
RemoteDataSynchTaskProcessor remoteCDCMTaskProcessor = new RemoteDataSynchTaskProcessor(message);
remoteCDCMTaskProcessor.start(); //This thread causes a new thread appear after execution finishes
LogUtil.debug(logger, "[distributeMessage()] [Message: ", message, "]... [OK]");
}
} catch (DTSException exception) {
// Logging stuff
}
}
}
答案 0 :(得分:1)
您是否有必要使用闭源第三方ThreadPool库?如果没有,请将RemoteDataSynchTaskProcessor
设为Runnable
(顺便说一句,我总是倾向于扩展/实施Runnable
以扩展Thread
)并尝试将其与ExecutorService
一起使用。< / p>
实际上,即使您必须使用第三方库,我也会尝试进行调试。您可以缩小问题的范围。
答案 1 :(得分:0)
对不起大家来说,好像它与ThreadPool或RemoteDataSynchTaskProcessor没有任何关系。
我没有注意到另一个ExecutorService是在RemoteDataSynchTaskProcessor中由ProcessResults()方法调用的方法中创建的。并且执行器服务器在其作业关闭后不会关闭。我的坏。
因此,如果有人遇到像这样一个有无法解释的thrad事件的问题,请检查你的代码两次:D在其他地方寻找问题:P