ExecutorService 和写入文件

ExecuterService and Writing to File

我正在尝试使用 ExecutorService 来写入文件。但是,当我执行这段代码时,在执行完成之前执行到 outFile.close();,抛出

java.io.IOException: Stream closed

如何才能在所有任务完成后才调用outFile.close()

(PS:为了代码清晰,我删除了所有 try/catch 块。)

ExecutorService executor = Executors.newFixedThreadPool(3);

for (int i = 1; i <= 1000; i++) {
  final int counter = i;
  executor.execute(new Runnable() {
    @Override
    public void run() {
      outFile.write(wld.getWord(counter) + "successful");
      outFile.write("\n");
    }               
  });
}

outFile.close();

您应该先等待所有任务完成。提交所有作业后,您可以调用 executor.shutdown() 并等待所有线程完成使用 executor.awaitTermination().

这是一个例子:

ExecutorService executor = Executors.newFixedThreadPool(3);

for (int i = 1; i <= 1000; i++) {
      final int counter = i;
      executor.execute(new Runnable() {
          @Override
          public void run() {
              outFile.write(wld.getWord(counter) + "successful");
              outFile.write("\n");
          }               
      });
}

executor.shutdown(); //shut down executor
executor.awaitTermination(60, TimeUnit.SECONDS); //waiting for 60 seconds

outFile.close(); //and then you may safely close the stream knowing that all the tasks have finished

注意:由于超时,主线程可能会在所有作业完成之前唤醒。您可以增加该时间或循环等待,直到满足 isTerminated() 条件:

executor.shutdown();
while (!executor.isTerminated()) {
    executor.awaitTermination(1, TimeUnit.SECONDS);
}