1

base ストリームがブロックされている場合、メソッドを呼び出すことでバイトをストリームに挿入できることを除いてInputStream、 base と同じ を作成することは可能ですか? InputStreamスケッチ:

public class HackInputStream extends InputStream {
    public HackInputStream (InputStream base) { /* stuff */ }
    public int read() throws IOException { /* stuff */ }
    public void insertByte(byte b) { /* stuff */ }
}

基本ストリームが確実にブロックされている場合にのみバイトを挿入するので、競合状態は問題になりません。ベース ストリームから貪欲にバイトを読み取り、LinkedBlockingQueue. insertByteバイトをキューに直接挿入し、キューreadからバイトを読み取るだけで、キューが空のときにブロックされました。

これはほとんど機能しました...しかし、Scannerusingを作成したときnew Scanner(new HackInputStream(System.in)nextLineメソッドは機能しませんでした。残念ながら、そもそもこの奇妙なクラスが必要だったのは、ブロックされたScanner!のブロックを解除するためでした。

(誰かがより良い解決策を持っている場合に備えて、私が解決しようとしている問題は次のとおりです。

私のプログラムは、コマンドが与えられたときにタスク (スレッド) を起動する「シェル」です。これらのタスクには、自然に終了するものと終了しないものがあります。タスクが終了したらすぐにコマンドプロンプトに戻りたいが、タスクが終了しない場合は、改行を入力して終了したい。

現在、メインスレッドはタスクが終了するのを待っていますが、ウォッチドッグスレッドは改行を待っており、改行を受け取った場合はタスクを終了します。現在、タスクが自然に終了した場合、改行を手動で入力しないとコマンドを入力できません。ウォッチドッグ スレッドは中断なくブロックされ、何があっても次の入力行を消費するため、次のコマンドが読み取られない可能性があります。System.inプログラムで改行をフィードできるように変更しようとしています。)

4

1 に答える 1

0

Scanner.nextLine()更新:タスクがまだ実行されている場合にのみ呼び出すことで、はるかに簡単な方法で問題を解決しました。

于 2013-01-22T19:26:44.703 に答える