如何解决为什么Java并行文件编写不起作用?
我正在尝试编写一个脚本,该脚本将使用不同的参数运行4次.exe程序。我为每个.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 docs 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();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。