В моей программе мне нужно запустить внешнюю команду в среде Ubuntu (ntpdate), используя java. В настоящее время мой код выглядит так:
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();
Этот код должен выполняться одновременно в нескольких потоках, чтобы максимизировать производительность (мне нужно протестировать список из 1.000.000 адресов с помощью ntpdate). Тем не менее, он работает очень медленно, почти не требует машинной обработки. Что я делаю неправильно? Как я могу сделать это более эффективным?
Та же проблема возникает при попытке выполнить «копание» с помощью .exec (), поэтому я сомневаюсь, что это из-за конкретной вызываемой программы. Существуют ли ограничения в использовании Runtime.exec () в многопоточной среде?