【问题标题】:ExecuterService and Writing to File [duplicate]ExecutorService 和写入文件 [重复]
【发布时间】:2019-11-30 18:21:54
【问题描述】:

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

【问题讨论】:

    标签: java file-io threadpool


    【解决方案1】:

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

    【讨论】:

    • 这正是我想要的。但是,我计算了有无执行器服务的执行时间,我感觉没有任何区别。使用 ExecutorService 时我应该看不到改进的执行吗?
    • 在这种情况下您几乎不会注意到任何性能提升,因为写入速度受到 IO 和操作系统特性的限制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 2016-12-22
    相关资源
    最近更新 更多