我正在尝试在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);
}
答案 0 :(得分:1)
使用超时调用Future.get()将超时get(),而不是线程(即.whataver在callable的call()方法中)。如果你的callable没有结束,它将保留在服务中,如果你继续添加更多,callables会累积。你应该在可调用的线程中设置一个超时机制。