【问题标题】:interrupt System.console().readLine()?中断 System.console().readLine()?
【发布时间】:2018-10-27 22:08:42
【问题描述】:

在我看来,一旦线程开始通过System.console().readLine()System.in.read() 读取输入,除了System.exit() 或提供输入之外,世界上绝对没有办法在功能上中断读取。

interrupt()ing 阅读线程什么都不做。即使stop()ing 也无济于事。 close()ing System.inSystem.in.read() 期间,直到通过提供输入完成读取之后才会执行任何操作。读取方法不使用任何超时参数,也不会自行超时。

是否根本没有办法“解锁”等待永远不会出现的控制台输入的线程?

【问题讨论】:

  • 这可能会有所帮助stackoverflow.com/questions/9479573/…
  • 另一个可能相关的问题和答案:stackoverflow.com/questions/3595926/…
  • @Prany 那是 c#... 完全不同的生态系统和功能
  • @AndrewHenle 是的,我通过关闭 System.in 尝试了等效的方法。它不会中断读取调用。如果你关闭system.in,你仍然需要输入一个字符,然后readLine()会抛出一个释放调用的异常。
  • 确实没有希望。奇怪的是,这个问题没有在 Console 类中解决。我能得到的最好的答案就是下面的答案。

标签: java multithreading io interrupt


【解决方案1】:

我根据这个article创建了一个变体


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.stop() 来停止consoleInputReadTask

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    相关资源
    最近更新 更多