java - 为什么 Java 并行文件写入不起作用?
问题描述
我正在尝试编写一个脚本,该脚本将使用不同的参数运行 .exe 程序 4 次。我为每个 .exe 运行创建了一个线程。每个线程将写入一个输出文件。我的问题是,它应该并行写入,但正如您在下面的屏幕截图中看到的那样,文件一个接一个地写入。这应该如何解决?
下面是主要方法:
public static void main (String args[]) {
ExecutorService executor = Executors.newFixedThreadPool(4);
executor.execute(new RunnableReader("myprogram.exe", param1, outputFile1));
executor.execute(new RunnableReader("myprogram.exe", param2, outputFile2));
executor.execute(new RunnableReader("myprogram.exe", param3, outputFile3));
executor.execute(new RunnableReader("myprogram.exe", param4, outputFile4));
executor.shutdown();
}
这是可运行的类:
public class RunnableReader implements Runnable {
private String program;
private String param;
String outputFile;
public RunnableReader(String program, String param, String outputFile) {
this.program = program;
this.param = param;
this.outputFile = outputFile;
}
@Override
public void run() {
try {
ProcessBuilder pb = new ProcessBuilder(program, param);
pb.redirectOutput(ProcessBuilder.Redirect.PIPE);
pb.redirectErrorStream(true);
Process proc = pb.start();
InputStream stream = proc.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile, true));
for(String output; (output = reader.readLine()) != null) {
writer.append(output);
writer.append("\n");
}
writer.close();
reader.close();
stream.close();
} catch(IOException e) {
e.printStackTrace();
}
}
}
解决方案
我自己无法对此进行测试,也不知道它是否真的会导致执行阻塞。但是对于它的价值,我认为我应该指出您InputStream
可能没有必要阅读该过程。
正如Oracle 文档 ProcessBuilder.redirectOutput(ProcessBuilder.Redirect.PIPE)
所述,导致Process.getInputStream()
返回进程的标准输出。
考虑到这一点,您可以摆脱整个for-loop
,而只是做类似的事情,ProcessBuilder.redirectOutput(new File(outputFile))
以便您的方法看起来像这样
@Override
public void run() {
try {
ProcessBuilder pb = new ProcessBuilder(program, param);
pb.redirectOutput(new File(outputFile));
pb.redirectErrorStream(true);
Process proc = pb.start();
} catch(IOException e) {
e.printStackTrace();
}
推荐阅读
- mysql - MySQL 中 lock_wait_timeout 变量的更改未反映在 Django 应用程序中
- python - 从 json 文件中删除新行空格并在 pandas 数据框中读取它
- hyperledger-fabric - 超级账本结构 2.0
- java - 如何优化此代码以使其更快
- javascript - 为什么我从两个差异中得到相同的结果?
- python - 导入序列化程序时的 DRF ImportError 循环
- django - 使用 django 注册后如何加载相同的页面
- php - 如何使用 .htaccess 重定向非结构化链接,例如(https://example.com/digital-marketing.php/ercbierubcrei)?
- django - 无法在 reportlab 3.5.34 中格式化中断标签
- python - Django:如何在数据迁移中使用异步任务?