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

时间:2010-02-12 04:30:36

标签: java input textinput stdio

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

我查看过具有nio类的Selector包,但我不确定如何在System.in方面使用它。我想我在运行服务器时肯定需要它,但现在一切都处于脱机状态。

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

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

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

4 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

keyDown()是deprecated所以我建议改为使用processKeyEventkeyListener

  

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

如果您有对要中断的线程对象的引用,则可以在该实例上调用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 ...