繁体   English   中英

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

[英]Concurrent/Non-blocking console keyboard input

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

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

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

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

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

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

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

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

不推荐使用 keyDown(),所以我建议使用processKeyEventkeyListener

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

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM