ServiceExecutor.submit在返回之前启动作业

时间:2015-05-13 13:22:43

标签: java multithreading thread-safety executorservice

我有一个程序利用ServiceExecutor在线程池中发布作业,当前执行程序中的最大作业数与池大小相同,因为每个作业都完成了一个新作业。

这是在同步块中完成的,如下所示(伪代码):

synchronized(running){
    try{
      if(addNewJob){
        MyCallable callable = queue.next();
        callable.doInitStuff();
        running.add(callable);
        callable.future = executor.submit(callable);
        if(callable.future == null){
          logger.log(Level.SEVERE, "No future for {0}", new Object[]{callable.getName()});
        }
      }
    }
    catch(Exception e){
      logger.log(Level.SEVERE, e);
    }
  }

在某些情况下,我注意到即使没有抛出异常,我的任务也会在设置callable.future之前达到自我超时(15秒)。我通过在callable.run()方法的顶部放置一个等待循环来检查它的未来是否已设置,从而解决了这个问题。

为什么executor.submit需要这么长时间才能返回,但是立即开始工作?

编辑:

serviceExecutor的构造如下:

executor = java.util.concurrent.Executors.newFixedThreadPool(8);

0 个答案:

没有答案