7

私はJavaでMUDに取り組んでいます。プレーヤーの入力をティックごとに読み取りますが、Scannerブロッキング操作を使用するものを使用しています。ノンブロッキング入力が欲しい。

nioクラスを持つパッケージを見てきましたがSelector、 に関してそれを使用する方法がわかりませんSystem.in。サーバーを稼働させたら間違いなく必要になると思いますが、今のところすべてオフラインです。

からメインクラスを拡張してAppletオーバーライドしようとしましkeyDownたが、最初の入力の後に入力が受け入れられなくなっただけです。確かに、もう何もブロックしていませんでしたが、それ以上の入力はありませんでした。keyDown二度と呼ばれなかったと思います。

スレッドがブロック操作を実行している場合でも、スレッドが中断される可能性がありますか?

この問題についての洞察に感謝します。

4

4 に答える 4

2

今ではマルチプラットフォームの方法でそれを行うことができないので、システムコンソールでそれを行うことはできません。

スイングウィンドウをコンソールとして使用することも、JNIベースのアプローチを見つけることもできますが、一部のプラットフォームでは機能しない場合があります。

JCursesを使用できます。動作する可能性があります。JNIに基づいており、WindowsとLinuxをサポートしています。

于 2010-02-12T11:30:57.320 に答える
-1

JLineもあなたの法案に合うかもしれません:

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

于 2010-02-15T13:10:03.760 に答える
-1

http からの書き込み/読み取りをブロックするという同様の問題を解決する必要がありました。その特定のケースでは、ローカル バッファーとスレッドを使用しました。

アイデアは単純で、1 つのスレッドが 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 ...
于 2010-02-17T08:09:14.213 に答える