执行器服务缺少一些任务

时间:2016-03-23 03:45:20

标签: java multithreading executorservice

我有大约900个任务。我已将threadpool计数设置为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人失去了。我已将调试器置于可调用状态,但控制甚至不会用于那些特定任务。虽然如果我把它们单独放置它们就可以了我缺少什么样的Executor服务逻辑?

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

2 个答案:

答案 0 :(得分:0)

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

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

  

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

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

答案 1 :(得分:0)

通过执行程序服务处理被拒绝的任务ThreadPoolExecutor提供了RejectedHandler类。

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

threadP.shutdown()