Процесс закрытия вызывает высокую загрузку процессора в input.readLine () - PullRequest
2 голосов
/ 13 июля 2020

У меня есть код, который запускает процесс cmd.exe с помощью ProcessBuilder , и когда я уничтожаю этот процесс с помощью process.destroy();, загрузка ЦП увеличивается (0%> 30%). Каждый раз, когда я запускаю и уничтожаю cmd.exe, появляются новые потоки, которые приводят к загрузке процессора до 100%. Могу я как-то остановить этот l oop, когда InputStream закончится? То же самое и в другом моем приложении, когда сервер останавливается, например, с помощью Ctrl- C, а клиент имеет высокое использование процессора.

input.readLine(); хочет читать из несуществующего InputStream и вызывает высокое использование процессора. Он застрял в этой строке.

Я использую Java 8

Код:

InputStream inputraw = process.getInputStream();
BufferedReader input = new BufferedReader(new InputStreamReader(inputraw));
while(true)    
{
    String cmd = input.readLine(); //HERE!
    //write cmd to console functions.....
}
if (isWindows) {
    command = (String.format("cmd.exe"));
} else {
    command = (String.format("sh"));
}
ProcessBuilder pb = new ProcessBuilder()
    .command(command)
    .redirectErrorStream(true);
process = pb.start();

1 Ответ

0 голосов
/ 14 июля 2020

Я нашел решение этой проблемы:

(Если вы хотите опубликовать лучший ответ, вы все равно можете это сделать)

    public static String readLine(InputStream s) throws Exception {
        String cmd = "";
        try {
            int ch = s.read();
            cmd += (char) ch;
            StringBuilder cmdBuilder = new StringBuilder(cmd);
            while (ch != 10 && ch >= 0) {
                ch = s.read();
                if (ch == 10 || ch < 0) break;
                cmdBuilder.append((char) ch);
            }
            cmd = cmdBuilder.toString();
        } catch (Exception ex) {
            throw new Exception("Input was empty!");
        }
        return cmd;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...