Я запускаю этот поток, который в основном выполняет системный вызов с использованием ProcessBuilder.
Runnable threadJob = new MyRunnable();
new Thread(threadJob).start();
Этот поток выполняет следующий Process Builder, используя его метод run():
ProcessBuilder pb = new ProcessBuilder(commands);
pb.redirectErrorStream(true);
Process process = pb.start();
// Read output
StringBuilder out = new StringBuilder();
BufferedReader brin = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null, previous = null;
while ((line = brin.readLine()) != null) {
if (!line.equals(previous)) {
previous = line;
out.append(line).append('\n');
}
}
Когда этот поток успешно выполняется, я запускаю внутри него другой поток для запуска xterm с помощью ProcessBuilder:
if (process.waitFor() == 0) {
Runnable threadJob2 = new XRunnable();
new Thread(threadJob2).start();
}
Xterm успешно запускается, используя следующий код в методе run() XRunnable():
ProcessBuilder pb = new ProcessBuilder(commands);
pb.redirectErrorStream(true);
Process process = pb.start();
// Read output
StringBuilder out = new StringBuilder();
BufferedReader brin = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null, previous = null;
while ((line = brin.readLine()) != null) {
if (!line.equals(previous)) {
previous = line;
out.append(line).append('\n');
}
}
if (process.waitFor() == 0) {
System.out.println("Xterm killed")
}
Проблема, с которой я сталкиваюсь, заключается в том, что управление всегда застревает на этом Xterm. Если я запущу еще один Xterm, используя тот же поток, он не получит управления, и я не смогу ничего напечатать в новом окне Xterm, пока предыдущее не будет уничтожено. Я думаю, проблема в том, что он застревает при чтении входного потока первого Xterm и не создает новый входной поток для чтения второго Xterm. Вот почему я могу что-то напечатать, как только первый Xterm будет убит. Кто-нибудь может предложить идеи для решения этой проблемы? Я хочу ввести что-то в каждом окне Xterm, которое я открываю, используя один и тот же код потока много раз.