[英]Help running Java runtime.exec() on multiple threads
在我的程序中,我需要使用Java在Ubuntu环境(ntpdate)中运行外部命令。 目前,我的代码如下所示:
Runtime rt = Runtime.getRuntime();
byte[] readBuffer = new byte[131072];
// Exec a process to do the query
Process p = null;
try {
p = rt.exec("ntpdate -q " + ip);
} catch (Exception ex) {
ex.printStackTrace();
}
if(p!= null){
try {
Thread.sleep(1000);
} catch (Exception e) {
}
// Read the input stream, copy it to the file
InputStream in = p.getInputStream();
try {
int count = 0, rc;
while ((rc = in.read(readBuffer, count, readBuffer.length - count)) != -1) {
count += rc;
if (count >= readBuffer.length) {
p.destroy();
break;
}
}
p.destroy();
result = processOutput(readBuffer, count);
} catch (IOException ex) {
ex.printStackTrace();
}
p.destroy();
为了最大化性能,需要在多个线程上同时运行此代码(我需要使用ntpdate测试1.000.000地址的列表)。 但是,它运行非常缓慢,几乎不消耗机器处理时间。 我究竟做错了什么? 我该如何提高效率?
尝试使用.exec()执行“挖掘”时会出现相同的问题,因此我怀疑这是由于调用了特定程序所致。 在多线程环境中使用Runtime.exec()有一些限制吗?
Java在这里最合适吗? 也许在shell脚本中会更好,该脚本在后台多次调用ntpdate
? 我不确定用Java在此代码段中能带来什么好处。
您在处理InputStream
时在做什么?
bash脚本可以这样做:
for ip in #...IP list
do
ntpdate -q $ip > $ip.txt &
done
为什么每次都等待1秒?
try {
Thread.sleep(1000);
} catch (Exception e) {
}
这只会降低应用程序的执行速度。
不知道为什么它很慢,但是您需要做更多的事情来关闭资源。 Runtime.exec()需要很多注意和注意,以避免挂起和文件描述符泄漏。
http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html
您确定问题不是ntpdate吗? 如果ntpdate只是坐在那里等待服务器响应并且具有很大的超时值,那么您的应用程序也将坐在那里。
尝试以0.2的超时值调用ntpdate,看看是否有区别。
另外,当您在代码中打开流时,一定要在完成后显式.close()它们。 否则,它可能要等到很长一段时间后才会发生,直到GC。
我想我找到了解决方案,那就是使用Java的Runtime.exec()没有解决方案。 问题似乎是所有启动进程的调用都已同步。 确实,如果您单独启动每个进程(通过同步),则获得一起启动所有进程的完全相同的结果。
exec是否有其他选择? 否则,我将需要一些没有Linux的ntpdate的解决方案...
我注意到您尝试的两个命令都涉及网络往返。 如果您呼叫echo
或cat
类的东西,速度如何?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.