Элемент управления застрял с первым экземпляром потоков

Я запускаю этот поток, который в основном выполняет системный вызов с использованием 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, которое я открываю, используя один и тот же код потока много раз.


person Ios mx    schedule 16.05.2014    source источник
comment
Чтения InputStream являются блокирующими операциями, поэтому, если вы хотите одновременно выполнять несколько операций чтения, вам понадобится несколько потоков... если только вы не хотите переключиться на NIO здесь.   -  person David Ehrmann    schedule 17.05.2014
comment
Мой плохой... Проблема была не в коде выше. Код, показанный выше, абсолютно прекрасен. Хэш-таблица искажала идентификаторы потоков. Спасибо за ответ Дэвид.   -  person Ios mx    schedule 17.05.2014


Ответы (1)


Мой плохой... Проблема была не в коде выше. Код, показанный выше, абсолютно прекрасен. Хэш-таблица искажала идентификаторы потоков. Спасибо за ответ Дэвид.

person Ios mx    schedule 17.05.2014