【问题标题】:Control is stuck with first instance of threads控制卡在第一个线程实例上
【发布时间】: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


【解决方案1】:

我的坏...问题不在于上面的代码。上面显示的代码绝对没问题。哈希表弄乱了线程 ID。感谢大卫的回复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    相关资源
    最近更新 更多