【问题标题】:Lost all submitted tasks in ThreadPoolExecutor在 ThreadPoolExecutor 中丢失了所有提交的任务
【发布时间】:2016-06-01 16:04:44
【问题描述】:

我有一个实例化的线程池

    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有可能吃掉我的任务吗?

【问题讨论】:

  • 是的,它的类变量不应该超出范围。我检查了它的所有线程都在等待任务。

标签: java multithreading threadpool threadpoolexecutor


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回答。我想你是对的。让我添加sone日志来验证。
  • 再次感谢!这确实是问题所在。
猜你喜欢
  • 2012-06-23
  • 1970-01-01
  • 2013-02-08
  • 1970-01-01
  • 1970-01-01
  • 2022-07-06
  • 2010-12-13
  • 1970-01-01
  • 2011-06-14
相关资源
最近更新 更多