gpt4 book ai didi

java - 线程的 run 方法完成后创建另一个线程

转载 作者:行者123 更新时间:2023-12-01 15:01:33 25 4
gpt4 key购买 nike

我有一个扩展 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] (Running)

我不知道为什么这个线程会出现并且永远不会终止,几天后我最终会得到数千个线程,并且池数量每次都会增加(例如线程 [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

这些线程是什么,我怎样才能摆脱它们?

编辑:似乎与我正在使用的闭源线程池库有关(根据询问执行器服务的评论来判断)。

我使用一个提供线程池功能的库。这就是我在应用程序启动开始时创建池的方式。

    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
}
}

}

最佳答案

您是否有理由必须使用闭源第 3 方 ThreadPool 库?如果没有,则将 RemoteDataSynchTaskProcessor 设为 Runnable (顺便说一句,我总是更喜欢扩展/实现 Runnable 而不是扩展 Thread)尝试将其与 ExecutorService 一起使用。

实际上,即使您必须使用第 3 方库,我也会尝试使用此方法进行调试。您可以缩小问题的范围。

关于java - 线程的 run 方法完成后创建另一个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13571831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com