如何在提交任何任务之前初始化固定线程池的所有线程? (JAVA)

How to initialize all threads of a fixed thread pool before submitting any tasks? (JAVA)

我正在尝试加速使用 ExecutorService 到 运行 并行任务的程序。它基本上是这样工作的:

  1. 初始化一个固定大小的线程池n

  2. 读取一堆(约 2500 个文件)XML 个包含任务输入的文件

  3. 使用池中的工作线程处理 XML 文件

一切都按预期工作,但我遇到的问题是每个工作线程都有一个 class 实例,它对输入数据进行计算。此实例存储在 ThreadLocal 中。现在,所有这些线程本地实例都是在相应的工作线程启动时创建的,这意味着在读取所有 XML 个输入文件之后。

由于计算对象的初始化需要相当长的时间,我宁愿让线程池从一开始就初始化所有工作线程,这样计算对象的初始化就可以运行与读取输入文件。

这里有一些代码可以帮助您了解它当前是如何工作的(我删除了与问题无关的代码)。

正在初始化线程池和线程本地:

  private final ExecutorService executor = Executors.newFixedThreadPool(Math.max(1, Runtime
      .getRuntime().availableProcessors() - 1));

  private ThreadLocal<Calculator> calculator = new ThreadLocal<Calculator>() {
    @Override
    protected Calculator initialValue() {
      try {
        Calculator instance = createCalculator();
        return instance;
      } catch (Throwable e) {
        throw new RuntimeException(e);
      }
    }
  };

提交新计算:

  @Override
  public FutureTask<Output> calc(Input input) {
    FutureTask<Output> task = new FutureTask<>(
        new Callable<Rueckgabe>() {
          @Override
          public Output call() throws Exception {
            try {
              return calculator.get().calc(input);
            } catch (Throwable e) {
              System.err.println("Exception: " + e.getMessage());
              e.printStackTrace(System.err);
              return null;
            }
          }
        });
    executor.execute(task);
    return task;
  }

ExecutorService 从一开始就启动池的所有工作线程的正确方法是什么?或者我是否必须执行 n 虚拟任务来强制初始化?

PS:由于IT限制,我不得不在可预见的未来使用Java7。

将 Threadfactory 添加到将执行初始化的 Executor。

executor = Executors.newFixedThreadPool(numprocrssors, new ThreadFactory ( ){
    public Thread newThread(Runnable r) {
        return new Thread(r){
            {calculator.get();} // this is an initialization statement, added to all constructors.
        };
    }});