【问题标题】:Asynchronous read from standard input从标准输入异步读取
【发布时间】:2014-11-06 14:38:18
【问题描述】:

我正在尝试在 Java 中实现从控制台读取异步输入。 基本上,我想这样做:

  1. 生成一个线程 T,它使用 BufferedReader 上的 readLine() 读取标准输入
  2. 继续程序
  3. 10 秒后,停止 T

问题是 T 中的 readLine() 调用,我无法阻止。 由于中断线程不起作用,我想我会尝试将数据从代码发送到标准输入,以解锁readLine()

所以我尝试了以下方法:10 秒后,做

FileOutputStream os = new FileOutputStream(FileDescriptor.in);
os.write("Unblocking line\n");

我认为它会像这样工作:我正在像在管道中一样写入标准输入,因此 T 中的代码应该读取 "Unblocking line\n" 并转到下一条指令。 太糟糕了,这不起作用:“Unblocking line”会立即显示在屏幕上,就像它被写入标准输出一样,它似乎不会影响readLine()

所以我的问题是:

  1. 为什么我的推理有误?
  2. 有没有一种简单、干净的方法来实现我想做的事情?请注意,我知道this solution。另外,请不要建议使用System.setIn:它不起作用。最后,我应该澄清一下我所说的简单和干净的含义:只使用线程,避免忙于等待。

提前致谢。

编辑:我不想关闭标准输入,因为我想在第 3 步之后再次读取。

【问题讨论】:

  • 您尝试中断线程...您尝试关闭 BufferedReader 吗?
  • 你已经看过java.nio 包了吗?

标签: java multithreading asynchronous input java-io


【解决方案1】:

您是否尝试过简单地调用

System.in.close()?

【讨论】:

  • 不,我讨厌我的 linux 上的 JVM
  • 我编辑了我的问题。我希望在第 3 步之后能够再次使用标准输入。
【解决方案2】:

readLine() 必须等待用户输入一些东西。如果什么都没有进入,那就永远。 在您的情况下,如果我认为没有输入任何内容,您希望线程在 10 秒后自动关闭! 相应地编码你的线程。如果 10 秒没有用户输入输入,那么主线程应该关闭输入等待线程,而不是永远等待。

【讨论】:

  • 如果你仔细阅读这个问题,你会发现我已经尝试中断线程。它确实工作。我试图 stop 线程并且它工作......太糟糕了,未来对 readLine 的调用将无法工作我用 stop() 终止线程。
  • 这看起来像是生产者消费者问题。这两个线程应该在同步块中运行。一个应该等待()。其他人应该在完成工作后通知()。
  • 你是对的。问题是,如果线程卡在readLine() 上,如何让线程调用notify()