Java:如何中止从System.in读取的线程

pts*_*pts 14 java stdio

我有一个Java线程:

class MyThread extends Thread {
  @Override
  public void run() {
    BufferedReader stdin =
        new BufferedReader(new InputStreamReader(System.in));
    String msg;
    try {
      while ((msg = stdin.readLine()) != null) {
        System.out.println("Got: " + msg);
      }
      System.out.println("Aborted.");
    } catch (IOException ex) {
      ex.printStackTrace();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

}

在另一个线程中,如何stdin.readline()在此线程中中止调用,以便打印此线程Aborted.?我试过了System.in.close(),但这没有任何区别,stdin.readline()仍然是阻塞.

我对没有的解决方案感兴趣

  • 忙等待(因为这会烧掉100%的CPU);
  • 睡觉(因为那时程序没有立即响应System.in).

McD*_*ell 8

Heinz Kabutz的新闻通讯显示了如何System.in使用缓冲区和中止读取ExecutorService.

现在,我不知道这种方法是否泄漏,不可移植或是否有任何非明显的副作用.就个人而言,我不愿意使用它.

您可以使用NIO通道文件描述符执行某些操作 - 我自己使用它们进行的实验并未产生任何结果.

  • 嗨,如果我理解不正确,请原谅我,读完这篇文章后,它似乎没有太多关于 ExecutorService (用于从线程中获取结果)的建议,而是更多关于使用 BufferedStream read() 和睡眠以便线程可以可中断。 (2认同)

Tom*_*ine 1

我的第一反应是,一根线确实System.in不搭在一起。

因此,首先,将其拆分,以便线程代码不会触及任何静态,包括System.in.

线程从缓冲区读取数据InputStream并将其传递到缓冲区。将 an 传递InputStream到现有线程中,该线程从缓冲区中读取数据,但也会检查您是否尚未中止。

  • “还检查你是否没有中止”——是的,这正是我想要做的,但我不知道当线程被阻塞“stdin.readLine()”时如何执行此操作。您能详细说明一下吗? (3认同)