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
からバイトを読み取るだけで、キューが空のときにブロックされました。
これはほとんど機能しました...しかし、Scanner
usingを作成したときnew Scanner(new HackInputStream(System.in)
、nextLine
メソッドは機能しませんでした。残念ながら、そもそもこの奇妙なクラスが必要だったのは、ブロックされたScanner
!のブロックを解除するためでした。
(誰かがより良い解決策を持っている場合に備えて、私が解決しようとしている問題は次のとおりです。
私のプログラムは、コマンドが与えられたときにタスク (スレッド) を起動する「シェル」です。これらのタスクには、自然に終了するものと終了しないものがあります。タスクが終了したらすぐにコマンドプロンプトに戻りたいが、タスクが終了しない場合は、改行を入力して終了したい。
現在、メインスレッドはタスクが終了するのを待っていますが、ウォッチドッグスレッドは改行を待っており、改行を受け取った場合はタスクを終了します。現在、タスクが自然に終了した場合、改行を手動で入力しないとコマンドを入力できません。ウォッチドッグ スレッドは中断なくブロックされ、何があっても次の入力行を消費するため、次のコマンドが読み取られない可能性があります。System.in
プログラムで改行をフィードできるように変更しようとしています。)