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