Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 执行器服务缺少几个任务_Java_Multithreading_Executorservice - Fatal编程技术网

Java 执行器服务缺少几个任务

Java 执行器服务缺少几个任务,java,multithreading,executorservice,Java,Multithreading,Executorservice,我有大约900项任务。我已将线程池计数设置为50。 我正在运行一个循环,并将每个任务提交给Executor服务 一旦控制出来,我称之为关机,如下所示 for (Entry<String, String> CurrentJob : Tasks.entrySet()) { m_service.submit(new MyTask(CurrentJob.getValue(), CurrentJob.getKey())); } m_s

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

一旦控制出来,我称之为关机,如下所示

for (Entry<String, String> CurrentJob : Tasks.entrySet()) {
            m_service.submit(new MyTask(CurrentJob.getValue(), CurrentJob.getKey()));
        }
          m_service.shutdown();
for(条目CurrentJob:Tasks.entrySet()){
提交(新的MyTask(CurrentJob.getValue(),CurrentJob.getKey());
}
m_service.shutdown();
每个任务平均需要1秒左右。现在我有两个问题

a) 几乎所有人都在做这项工作(850人),但大约有50人失踪。我已经将调试器设置为callable,但对于那些特定的任务,甚至都没有控制权。虽然如果我把它们单独放在一起,它们会起作用。我遗漏了执行人服务的哪些逻辑


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

ExecutorService不会等待以前提交的任务完成。从JavaDocs:

此方法不会等待以前提交的任务完成执行。使用此选项可以完成此操作


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

要通过执行器服务处理被拒绝的任务,ThreadPoolExecutor提供了RejectedHandler类

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


threadP.shutdown()

no.That;因为控件在0秒内退出,即使在3-4分钟后,我的任务也会继续完成,所以没有发生。为了便于论证,我还将shutdown替换为waitivetermination.BlockingQueue BlockingQueue=newarrayblockingqueue(1000);RejectedExecutionHandler RejectedExecutionHandler=new ThreadPoolExecutor.CallerRunPolicy();m_service=new ThreadPoolExecutor(50,50,0L,TimeUnit.ms,blockingQueue,rejectedExecutionHandler);仍然不起作用。你能详细说明一下你的最大线程池大小是多少吗?请发布更多代码