【发布时间】:2014-05-16 20:58:30
【问题描述】:
我正在启动这个线程,它基本上使用 ProcessBuilder 执行系统调用。
Runnable threadJob = new MyRunnable();
new Thread(threadJob).start();
该线程使用其 run() 方法执行以下 Process Builder:
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');
}
}
当这个线程成功执行后,我在其中启动一个不同的线程来使用 ProcessBuilder 启动 xterm:
if (process.waitFor() == 0) {
Runnable threadJob2 = new XRunnable();
new Thread(threadJob2).start();
}
在XRunnable()的run()方法中使用如下代码成功启动Xterm:
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 被杀死后输入一些东西。任何人都可以提出解决这个问题的想法吗?我想在使用相同线程代码多次打开的每个 Xterm 窗口中输入一些内容。
【问题讨论】:
-
InputStream 读取是阻塞操作,所以如果你想同时进行多个读取,你需要多个线程……除非你想切换到 NIO,在这里。
-
我的坏...问题不在于上面的代码。上面显示的代码绝对没问题。哈希表弄乱了线程 ID。感谢大卫的回复。
标签: java multithreading processbuilder