[英]Concurrent/Non-blocking console keyboard input
我正在研究java中的MUD。 我每次打勾都会读取播放器输入,但我正在使用使用阻塞操作的Scanner
。 我想要非阻塞输入。
我查看了具有Selector
类的nio
包,但我不确定如何在System.in
方面使用它。 我想,一旦我运行服务器,我肯定会需要它,但现在一切都是离线的。
我已经尝试从Applet
扩展主类并覆盖keyDown
,但这只是意味着在第一个之后不再接受输入。 当然,我不再阻止任何东西了,但是没有更多的输入。 我想, keyDown
再也没有被调用过。
也许线程即使在执行阻塞操作时也可能被中断?
感谢您对此问题的任何见解。
您无法使用系统控制台执行此操作,因为现在无法以多平台方式完成此操作。
您可以使用swing窗口作为控制台或查找基于JNI的方法,但它可能无法在某些平台上运行。
你可以使用JCurses 。 它可能有用,它基于JNI并支持Windows和Linux。
不推荐使用 keyDown(),所以我建议使用processKeyEvent和keyListener 。
也许线程即使在执行阻塞操作时也可能被中断?
是,如果您有对要中断的线程对象的引用,则只需在该实例上调用interrupt()方法即可。 在线程的run方法中,您可以处理中断的异常。 然而,这似乎有点黑客攻击。 我没有看到这比使用简单的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 ...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.