7

我正在用java开发一个MUD。我每次都读取玩家输入,但我使用Scanner的是阻塞操作。我想要非阻塞输入。

我查看了包含类的nioSelector,但我不确定如何使用它来处理System.in. 我想一旦我运行服务器,我肯定会需要它,但现在一切都处于脱机状态。

我已经尝试从Applet和覆盖扩展主类keyDown,但这只是意味着在第一个之后不再接受输入。当然,我不再阻止任何东西,但是没有更多的输入。keyDown我猜,再也没有接到电话。

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

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

4

4 回答 4

2

你不能用系统控制台来做到这一点,因为现在它不能以多平台的方式完成。

您可以将摇摆窗口用作控制台或找到基于 JNI 的方法,但它可能不适用于某些平台。

您可以使用JCurses。它可能会工作,它基于 JNI 并支持 Windows 和 Linux。

于 2010-02-12T11:30:57.320 回答
0

keyDown() 已弃用,因此我建议改用processKeyEventkeyListener

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

是的,如果您引用了要中断的线程对象,您可以简单地在该实例上调用interrupt()方法。并且在线程的run方法中你可以处理中断的异常。但是,这似乎有点hack-ish。我看不出这比使用简单的 KeyListener 更有帮助。

于 2010-02-16T10:51:18.713 回答
-1

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

想法很简单,一个线程从标准输入读取并将内容放入缓冲区。第二做同样的写作。

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

示例代码:

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 ...
于 2010-02-17T08:09:14.213 回答
-1

JLine 也可能适合您的账单:

http://jline.sourceforge.net/apidocs/src-html/jline/ConsoleReader.html#line.1447

于 2010-02-15T13:10:03.760 回答