14

この実装では要素が追加されていないため、ファイルのコンテンツからキューに入力する場合、深さは増加しないようです。

    BlockingQueue<String> q = new SynchronousQueue<String>();
            ...
        fstream = new FileInputStream("/path/to/file.txt");
            ...
        while ((line = br.readLine()) != null) {
            if (q.offer(line))
                System.out.println("Depth: " + q.size()); //0
        }

offerで置き換えるadd場合、例外がスローされた場合

Exception in thread "main" java.lang.IllegalStateException: Queue full
  ...

私は何を間違っていますか?最初の要素を挿入するとすぐにキューがいっぱいになるのはなぜですか?

4

3 に答える 3

18

次のドキュメントを確認してくださいSynchronousQueue

各 put が take を待機する必要があるブロッキング キュー (およびその逆)。同期キューには内部容量がなく、1 の容量さえありません。要素は取得しようとしたときにのみ存在するため、同期キューを覗くことはできません。別のスレッドが要素を削除しようとしない限り、(任意のメソッドを使用して) 要素を追加することはできません。反復するものがないため、反復できません。キューの先頭は、最初にキューに入れられたスレッドがキューに追加しようとしている要素です。キューに入れられたスレッドがない場合、要素は追加されず、ヘッドは null です。他の Collection メソッド (contains など) のために、SynchronousQueue は空のコレクションとして機能します。このキューは null 要素を許可しません。

キューに追加する前に、コンシューマーをセットアップして待機させる必要があります。

offerコンシューマーがいない場合、このメソッドは何もしません。

別のスレッドが受信を待機している場合、指定された要素をこのキューに挿入します。

于 2012-02-05T18:42:02.857 に答える
2

Javadoc から:

.各 put が take を待たなければならないブロッキング キュー、およびその逆。同期キューには内部容量がなく、容量が 1 つでもありません

于 2012-02-05T18:42:48.257 に答える