прерывать System.console (). readLine ()? - PullRequest
0 голосов
/ 17 мая 2018

Мне кажется, что как только поток начинает читать ввод с помощью System.console().readLine() или System.in.read(), во вселенной нет абсолютно никакого способа функционально прервать чтение, кроме System.exit() или предоставления ввода.

interrupt() чтение темы ничего не делает. Даже stop() это ничего не делает. close() ing System.in во время System.in.read() ничего не делает до тех пор, пока чтение не завершится с вводом. Методы чтения не принимают ни параметров тайм-аута, ни времени ожидания самостоятельно.

Нет ли вообще никакого способа "разблокировать" поток, ожидающий консольного ввода, который никогда не придет?

1 Ответ

0 голосов
/ 29 апреля 2019

Я создал вариант на основе этой статьи


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.concurrent.Callable;

public class ConsoleInputReadTask implements Callable<String> {
    private boolean cont = true;

    public void stop() {
        cont = false;
    }

    public String call() throws IOException {
        BufferedReader br = new BufferedReader(
                new InputStreamReader(System.in));
        System.out.println("ConsoleInputReadTask run() called.");
        String input;
        try {
            // wait until we have data to complete a readLine()
            while (!br.ready()) {
                Thread.sleep(200);
                if (!cont) {
                    System.out.println("ConsoleInputReadTask() stopped");
                    return null;
                }
            }
            input = br.readLine();
        } catch (InterruptedException e) {
            System.out.println("ConsoleInputReadTask() cancelled");
            return null;
        }
        return input;
    }
}

Часть основной программы

    private ConsoleInputReadTask consoleInputReadTask;

    public String readLine() throws InterruptedException {
        ExecutorService ex = Executors.newSingleThreadExecutor();
        String input = null;
        try {
            Future<String> result = ex.submit(consoleInputReadTask);
            try {
                input = result.get();
            } catch (ExecutionException e) {
                e.getCause().printStackTrace();
            }
        } finally {
            ex.shutdownNow();
        }
        return input;
    }

    public void test() {
        consoleInputReadTask = new ConsoleInputReadTask();
        while ((line = readLine()) != null) {
// ...
        }

Вы можете остановить consoleInputReadTask, вызвав consoleInputReadTask.stop()в другой теме

...