ThreadPoolExecutorService顺序执行线程而不是并发执行?

时间:2018-02-21 16:56:41

标签: java multithreading executorservice threadpoolexecutor executor

所以我试图从一个线程中启动一个新线程。

即。

function(update):
  under certain conditions:
    add a new thread running same service as current

理想情况下,我希望运行新线程并继续执行当前线程。

相反,会创建一个新线程,但只有在完成后我的主机线程才会再次继续。

理想情况下,我需要它同时执行,其中添加新线程与从我的原始类添加线程具有相同的效果。

如何使用执行程序服务执行此操作?

我目前的初始化时间如下:

ExecutorService executorService = Executors.newFixedThreadPool(100);

添加线程功能:

 final SimulatedAnnealingCallable simulatedAnnealingCallable =
            new SimulatedAnnealingCallable(this, schedule);

 final Future<Schedule> future = executorService.submit(simulatedAnnealingCallable);

try {
        future.get();
    } catch (ExecutionException ex) {
        ex.getCause().printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

稍后关机

1 个答案:

答案 0 :(得分:1)

原因是你在future.get()中阻塞了你的主线程。

实际发生的是你的主线程用执行程序启动一个新的未来任务,而不是通过告诉它等待执行任务的结果来阻止主线程。

处理此问题的一种方法是等待未来完成,而是添加功能以让您知道任务已使用callable完成。

例如

public interface CompletedTask {
  void completed(boolean succes);
}

// change SimulatedAnnealingCallable to receive CompletedTask in constructor
// and call the instanc's completed method

public LogicClass implements CompletedTask {

  private void someFunc() {
    final SimulatedAnnealingCallable simulatedAnnealingCallable =
            new SimulatedAnnealingCallable(this, schedule);
    executorService.submit(simulatedAnnealingCallable);
  }

  public void completed(boolean succes) {
    System.out.println("task is completed with " + success);
  }
}

HTH, 伽