执行程序服务缺少一些任务



我有大约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人失踪。我已经将调试器设置为可调用,但对于那个些特定的任务,控制甚至并没有出现。尽管如果我把它们单独放在一起,它们是有效的。我缺少执行器服务的什么逻辑?

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

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

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

此方法不等待以前提交的任务完成执行。使用awaitTermination来完成此操作。

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

为了处理被执行器拒绝的任务,服务ThreadPoolExecutitor提供了RejectedHandler类。

示例ThreadPoolExecutitor threadP=(ThreadPoolExecutior)Executitors.newFixedThreadPool(3);threadP.setRejectedExecutionHandler(new RejectedHandler());//添加任务

threadP.shutdown()

相关内容

  • 没有找到相关文章

最新更新