在ThreadPoolExecutor中丢失所有提交的任务

时间:2016-02-19 22:24:19

标签: java multithreading threadpool threadpoolexecutor

我有一个用

实例化的线程池
    LinkedBlockingQueue<Runnable> taskQue = new LinkedBlockingQueue<Runnable>();
    new ThreadPoolExecutor(100, 100, 0L, TimeUnit.MILLISECONDS, taskQue );

我向它提交了大量(18k +)的Runnable任务;每个任务都会处理并将数据发送到另一个LinkedBlockingQueue,比如dataQue,我有一个while(True)循环来从dataQue轮询和处理这些数据。

我每分钟记录taskQue的大小,它可以正常工作一段时间,因为我可以看到它的大小逐渐减小。但是,自程序启动后约20分钟后,尺寸从17927降至0!我的程序仍然在此时运行,而while循环仍在处理来自dataQue的数据。

我想知道这怎么可能?我一直在谷歌上搜索javadocs。 LinkedBlockingQueue和ThreadPoolExecutor似乎都不会自动取消/超时任务。 GC有可能吃掉我的任务吗?

1 个答案:

答案 0 :(得分:1)

不,这是不可能的。这肯定是由于代码中的某些内容。

一个非常常见的情况是您的任务由于某些异常(因此非常快)而失败,但您只是看不到堆栈跟踪。一件容易的事就是在您的任务中捕获Throwable并记录异常。您也可以使用Callable代替,并通过返回的Future检查任务的状态。