在Java中多次运行命令行程序-这是正确的吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在Java中多次运行命令行程序-这是正确的吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1924字,纯文字阅读大概需要3分钟。
内容图文
![在Java中多次运行命令行程序-这是正确的吗?](/upload/InfoBanner/zyjiaocheng/672/085ec7c4fe6c415d81ff84d7790626d7.jpg)
我有一个程序(使用Java),在执行过程中需要多次使用不同的参数使用另一个程序.它是多线程的,除了在执行过程中调用该程序外,还需要做其他事情,因此我需要使用Java来做到这一点.
问题是,所有Runtime.exec()调用似乎都是由Java以同步方式完成的,这样线程就不会成为围绕函数本身的瓶颈,而是在Java调用中成为瓶颈.因此,我们有一个运行缓慢的程序,但这不会成为任何系统资源的瓶颈.
为了解决该问题,我决定不关闭流程,并使用以下脚本进行所有调用:
#!/bin/bash
read choice
while [ "$choice" != "end" ]
do
$choice
read choice
done
并且所有以前的exec调用都被替换为:
private Process ntpProc;
Initializer(){
try {
ntpProc = Runtime.getRuntime().exec("./runscript.sh");
} catch (Exception ex) {
//Error Processing
}
}
public String callFunction(String function) throws Exception e{
OutputStream os = ntpProc.getOutputStream();
String result = "";
os.write((function + "\n").getBytes());
os.flush();
BufferedReader bis = new BufferedReader(new InputStreamReader(ntpProc.getInputStream()));
int timeout = 5;
while(!bis.ready() && timeout > 0){
try{
sleep(1000);
timeout--;
}
catch (InterruptedException e) {}
}
if(bis.ready()){
while(bis.ready()) result += bis.readLine() + "\n";
String errorStream = "";
BufferedReader bes = new BufferedReader(new InputStreamReader(ntpProc.getErrorStream()));
while(bes.ready()) errorStream += bes.readLine() + "\n";
}
return result;
}
public void Destroyer() throws exception{
BufferedOutputStream os = (BufferedOutputStream) ntpProc.getOutputStream();
os.write(("end\n").getBytes());
os.close();
ntpProc.destroy();
}
效果很好,实际上使我的程序性能提高了十倍.所以,我的问题是:这是正确的吗?还是我错过了这种做事的方法,这些方法最终会使一切都变得非常错误?
解决方法:
如果要从进程错误和输入流(也称为stderr和stdout)中读取,则需要在专用线程上执行此工作.
主要问题是,当缓冲区被填满时,您需要清空缓冲区,并且只能在单独的线程上执行此操作.
您所做的,您已经设法缩短了输出,因此它不会溢出这些缓冲区,但是潜在的问题仍然存在.
而且,根据过去的经验,从Java调用外部进程非常慢,因此您的方法毕竟可能会更好.
内容总结
以上是互联网集市为您收集整理的在Java中多次运行命令行程序-这是正确的吗?全部内容,希望文章能够帮你解决在Java中多次运行命令行程序-这是正确的吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。