【问题标题】:ThreadPool don't run submitted tasksThreadPool 不运行提交的任务
【发布时间】: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


【解决方案1】:

好的,我收集了足够的统计数据来说明:这是具体 linux 内核的问题

[root@mag]$ uname -a
Linux ns.mag 2.4.20-8smp #1 SMP Thu Mar 13 17:45:54 EST 2003 i686 i686 i386  GNU/Linux

redhat 盒子。即使在 2.4.31 和更高版本上也没有重现。

【讨论】:

    猜你喜欢
    • 2011-05-27
    • 2019-04-28
    • 2020-11-05
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    相关资源
    最近更新 更多