首页 > 解决方案 > ExecuterService 和写入文件

问题描述

我正在尝试使用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();

标签: javafile-iothreadpool

解决方案


您应该首先等待所有任务完成。提交所有作业后,您可以调用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);
}

推荐阅读