ExecutorService 和写入文件 [重复]

Posted

技术标签:

【中文标题】ExecutorService 和写入文件 [重复]【英文标题】:ExecuterService and Writing to File [duplicate] 【发布时间】: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();

【问题讨论】:

【参考方案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 和操作系统特性的限制。

以上是关于ExecutorService 和写入文件 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java:在特定队列大小后阻止提交的 ExecutorService [重复]

Jboss Java EE 容器和一个 ExecutorService

在webapp中优雅地关闭ExecutorService?

ExecutorService线程池中怎么去暂停和继续一个线程

将 InputStream 写入文件 [重复]

从文件中重复写入和加载对象的 ArrayList