缓存线程池无限增长

时间:2014-05-09 19:56:55

标签: java concurrency concurrent.futures

我正在尝试在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);
 }

1 个答案:

答案 0 :(得分:1)

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