gpt4 book ai didi

java - 缓存线程池无限增长

转载 作者:行者123 更新时间:2023-12-01 13:00:06 29 4
gpt4 key购买 nike

我正在尝试在 Java 中实现一个缓存线程池来读取来自总线的数据。一切都很好......只要我有数据传入该总线。

如果我断开数据线,程序就会开始从池中生成无尽的线程。我间歇性地检查/proc/{PID}/fd,大约一个小时内它从 8 增加到 100+。最终系统崩溃了。

我正在为这些线程提交一个超时值(30 秒),它们确实会触发我在日志文件中看到的 TimeoutException Catch。这些线程超时时不应该结束吗?

一些代码:

private static ExecutorService executorService = Executors.newCachedThreadPool();

(我后来提供了一个可调用的)

long[] rawFrame;
Future<long[]> future = executorService.submit(callable);
try {
rawFrame = future.get(timeout, timeUnit); // timeout is 30 seconds
// Do some things with the raw frame and store as parsedFrame
return parsedFrame;
} catch (TimeoutException e) {
LOGGER.error("Bus timeout. Check connection");
return null;
} finally {
future.cancel(true);
}

我刚刚学习如何在 Java 中进行并发处理,但据我所知,这些进程应该超时,但相反,它们似乎只是坐在那里等待总线上的数据,而不是吐出数据。

我错过了什么?

编辑:感谢您帮助我缩小范围。

这是我的可调用

private class BusCallable implements Callable<long[]> {

private long messageId;
private boolean readAnyFrame = false;

public BusCallable() {
super();
readAnyFrame = true;
}

public BusCallable(long id) {
super();
this.messageId = id;
readAnyFrame = false;
}

@Override
public long[] call() throws Exception() {
if (readAnyFrame) {
return read(busInterface);
}
return readFrame(busInterface, messageId);
}

最佳答案

使用超时调用 Future.get() 将使 get() 超时,而不是线程超时(即,whataver 在可调用的 call() 方法中)。如果您的可调用对象没有结束,它将保留在服务中,并且如果您继续添加更多可调用对象,则会累积。您应该在可调用的线程中放置超时机制。

关于java - 缓存线程池无限增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23572940/

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