java - 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();
解决方案
您应该首先等待所有任务完成。提交所有作业后,您可以调用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);
}
推荐阅读
- automation - Jmeter Recorder - 无法访问 github 网站
- c# - FirefoxOptions 的 setPreference 方法未通过 Selenium C# 得到识别
- javascript - 如何使用空格键自动播放音乐和停止/恢复?
- http - SSE 与乐山 LWM2M 演示服务器
- azure-devops - 我可以在 Azure Pipelines 中对变量进行子字符串化吗?
- javascript - 反应格式字符串日期到日期格式 timzone
- python - 嵌套for循环的并行化
- swift - Swift NSObject 类不能可靠地响应委托方法调用
- html - 如何在电子的自定义标题栏中显示/隐藏最大化/最小化按钮
- mysql - 以更新语句返回的MYSQL受影响的行来解决同步问题