我有大约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应该等到所有线程都完成但我的计时器总是说时间为零。
答案 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()