【发布时间】:2011-06-15 00:02:57
【问题描述】:
我对 java ThreadPool 有一个奇怪的问题
我将 executorService 定义如下:
ExecutorService executorService = Executors.newFixedThreadPool(5)
及以后提交任务:
while (!manager.stop()) {
File file = getFile();
if (file != null) {
String name = file.getName();
log.debug("add new task with name {}", name);
outExecutorInfo();
Future<?> task = executorService.submit(getTask(file));
outTaskInfo(task);
executeTasks.put(name, task);
outExecuteTasks();
}
}
outExecuteTasks 记录一些调试信息,包括任务计数:
log.debug("activeCount={}, completedTaskCount={}, taskCount={}. poolSize={}",
new Object[] { activeCount, completedTaskCount,taskCount, poolSize });
运行一段时间后(根据线程池完成任务计数器执行 50-100 个任务后)我看到奇怪的行为 - 提交的任务附加到池队列但根本没有执行! ThreadPool 报告活动任务 = 0,任务队列很大并且还在计数,并且没有根据日志执行的任务。
有人有什么问题吗?
【问题讨论】:
-
可能是 Java 中的错误。您使用的是最新版本的 JRE 吗?
-
嗯...不确定。我在开发和测试环境中使用最新的 JRE,但不确定生产...我会检查它。
-
我认为JDK bug的可能性很小。应该再次检查您的代码。
-
这台服务器有大约 40 个安装和问题,只有其中两个。我正在检查工作实例和未工作实例的软件版本,只有 Linux 内核版本不同。我将尝试重新安装 linux 以隔离这一点。还有使用 java 1.6_01,可能我也需要升级它。
-
使用 getTask(file) 中的日志语句来检查您的任务是否正在执行。 getTask(file) 在您的情况下应该返回一个 Runnable ,其中将覆盖 run 方法。在 run 方法中放置一些跟踪语句并检查它
标签: java multithreading threadpool