并发/非阻塞控制台键盘输入

我正在研究java中的MUD。 我每次打勾都会看到播放器输入,但我正在使用使用阻塞操作的Scanner 。 我想要非阻塞输入。

我查看了具有Selector类的nio包,但我不确定如何在System.in方面使用它。 我想我在运行服务器时肯定需要它,但现在一切都是离线的。

我已经尝试从Applet扩展主类并重写keyDown ,但这只是意味着在第一个之后不再接受输入。 当然,我不再阻止任何东西了,但是没有更多的输入。 我想, keyDown再也没有被调用过。

也许线程即使在执行阻塞操作时也可能被中断?

感谢您对此问题的任何见解。

您无法使用系统控制台执行此操作,因为现在无法以多平台方式完成此操作。

您可以使用swing窗口作为控制台或查找基于JNI的方法,但它可能无法在某些平台上运行。

你可以使用JCurses 。 它可能有用,它基于JNI并支持Windows和Linux。

不推荐使用 keyDown(),因此我建议使用processKeyEvent和keyListener 。

也许线程即使在执行阻塞操作时也可能被中断?

如果您有对要中断的线程对象的引用,则可以在该实例上调用interrupt()方法。 在线程的run方法中,您可以处理中断的exception。 然而,这似乎有点黑客攻击。 我没有看到这比使用简单的KeyListener更有帮助。

我不得不解决阻止从http写入/读取的类似问题。 在那种特殊情况下,我使用了本地缓冲区和线程。

想法很简单,一个线程从stdin读取并将内容放入缓冲区。 其次与写作相同。

然后在缓冲区中使用非阻塞查询。

示例代码:

 class NonBlockingReader implements Runnable{ Reader in; List buffer; public void run(){ String line=null; while((line=in.readLine())!=null){ storeLine(line); } } private synchronized storeLine(String line){ buffer.add(line); } public synchronized String getLine(){ if(list.size()>0) return list.removeFirst(); return null; } } // .. same for writer, then you jast pass stdin and stdout ...