我正在研究java中的MUD。我每次打勾都会读取播放器输入,但我使用的是使用阻塞操作的Scanner
。我想要非阻塞输入。
我查看过具有nio
类的Selector
包,但我不确定如何在System.in
方面使用它。我想我在运行服务器时肯定需要它,但现在一切都处于脱机状态。
我尝试从Applet
扩展主要类并覆盖keyDown
,但这只是意味着在第一个之后不再接受输入。当然,我不再阻止任何东西了,但是没有更多的输入。我想,keyDown
再也没有被召唤过。
也许线程即使在执行阻塞操作时也会被中断?
感谢您对此问题的任何见解。
答案 0 :(得分:2)
您无法使用系统控制台执行此操作,因为到目前为止,无法以多平台方式完成此操作。
您可以使用swing窗口作为控制台或查找基于JNI的方法,但它可能无法在某些平台上运行。
您可以使用JCurses。它可能有用,它基于JNI并支持Windows和Linux。
答案 1 :(得分:0)
keyDown()是deprecated所以我建议改为使用processKeyEvent和keyListener。
也许线程即使在执行阻塞操作时也会被中断?
如果您有对要中断的线程对象的引用,则可以在该实例上调用interrupt()方法。在线程的run方法中,您可以处理中断的异常。然而,这似乎有点黑客攻击。我没有看到这比使用简单的KeyListener更有帮助。
答案 2 :(得分:-1)
答案 3 :(得分:-1)
我必须解决阻止从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 ...