在 ThreadPoolExecutor 中丢失所有提交的任务
Lost all submitted tasks in 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 似乎都不会自动执行 cancel/timeout 任务。 GC 有可能吃掉我的任务吗?
不,那不可能。这肯定是由于您的代码中的某些内容造成的。
一个非常常见的情况是您的任务由于某些异常而失败(因此非常快),但您只是看不到堆栈跟踪。一件简单的事情是在您的任务中捕获 Throwable
并记录异常。您也可以改用 Callable
并通过返回的 Future
.
检查任务的状态
我有一个实例化的线程池
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 似乎都不会自动执行 cancel/timeout 任务。 GC 有可能吃掉我的任务吗?
不,那不可能。这肯定是由于您的代码中的某些内容造成的。
一个非常常见的情况是您的任务由于某些异常而失败(因此非常快),但您只是看不到堆栈跟踪。一件简单的事情是在您的任务中捕获 Throwable
并记录异常。您也可以改用 Callable
并通过返回的 Future
.