在我的程序中,我需要使用 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() 执行“dig”时会出现同样的问题,所以我怀疑这是因为调用了特定的程序。在多线程环境中使用 Runtime.exec() 是否有一些限制?
最佳答案
Java 是这里最合适的方法吗?也许这在 shell 脚本中会更好,它在后台多次调用 ntpdate
?我不确定在 Java 中执行此代码片段对您有何好处。
你在用进程中的 InputStream
做什么?
一个 bash 脚本可以这样做:
for ip in #...IP list
do
ntpdate -q $ip > $ip.txt &
done
关于java - 帮助在多个线程上运行 Java runtime.exec(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3567264/