【问题标题】:Executor service missing few tasks执行者服务缺少一些任务
【发布时间】:2016-07-10 05:30:54
【问题描述】:

我有大约 900 个任务。我已将线程池计数设置为 50。 我正在运行一个循环并将每个任务提交给 executorService。

一旦控制出来,我就会如下调用关机

for (Entry<String, String> CurrentJob : Tasks.entrySet()) {
            m_service.submit(new MyTask(CurrentJob.getValue(), CurrentJob.getKey()));
        }
          m_service.shutdown();

每个任务平均需要大约 1 秒。现在我有两个问题

a) 几乎所有人都在做这项工作(850),但大约有 50 个丢失了。我已将调试器置于 callable ,但这些特定任务甚至没有控制。尽管如果我将它们单独放置,它们会起作用。我缺少什么 Executor 服务的逻辑?

b) 我在这段代码周围设置了一个计时器,根据 javaDoc Shutdown 应该等到所有线程都完成,但我的计时器总是说时间为零。

【问题讨论】:

  • 您的最大线程池大小是多少?请发布更多代码

标签: java multithreading executorservice


【解决方案1】:

ExecutorService 不会等待之前提交的任务完成。来自 JavaDocs:

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html#shutdown--

此方法不等待先前提交的任务完成执行。使用 awaitTermination 来做到这一点。

那么可能发生的情况是 ExecutorService 关闭,继续完成排队的工作,但 JVM 退出,因为您的主线程终止(只留下守护线程,这不会让 JVM 保持活动状态)?也许这就是问题所在?

【讨论】:

  • 没有。那不会发生,因为控制在 0 秒内退出,即使在 3-4 分钟后我的任务也会继续完成。只是为了争论,我也用 awaitTermination 替换了 shutdown。
【解决方案2】:

执行器服务ThreadPoolExecutor提供RejectedHandler类来处理被拒绝的任务。

示例 ThreadPoolExecutor threadP = (ThreadPoolExecutor) Executors.newFixedThreadPool(3); threadP.setRejectedExecutionHandler(new RejectedHandler()); // 添加任务

threadP.shutdown()

【讨论】:

  • BlockingQueueblockingQueue = new ArrayBlockingQueue(1000); RejectedExecutionHandler deniedExecutionHandler = new ThreadPoolExecutor.CallerRunsPolicy(); m_service = new ThreadPoolExecutor(50, 50, 0L, TimeUnit.MILLISECONDS, blockingQueue, deniedExecutionHandler);还是行不通。你能详细说明一下吗
猜你喜欢
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
  • 2023-03-19
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
相关资源
最近更新 更多