4

私は、制限された生産者と消費者の問題を解決するプログラムを書きました。構築中ArrayBlockingQueueに容量100を定義しました。スレッド内にテイクアンドプットするメソッドを使用しています。そして、時々私はそれらの間にテイクを入れて102回置くのを見ることに気づきました。なぜそれが起こるのですか?

プロデューサー実行メソッド:

public void run() {
    Object e = new Object();
    while(true) {
        try {
            queue.put(e);
        } catch (InterruptedException w) {
                System.out.println("Oj, nie wyszlo, nie bij");
        }
        System.out.println("Element added");

    }
}

消費者実行方法:

public void run() {
    while(true) {
        try {
            queue.take();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Element removed");
    }
}

出力のあるファイルのuniq-cの一部:

102 Element removed
102 Element added
102 Element removed
102 Element added
102 Element removed
102 Element added
102 Element removed
102 Element added
102 Element removed
102 Element added
102 Element removed
102 Element added
  2 Element removed
  2 Element added
102 Element removed
102 Element added
4

1 に答える 1

5

容量100を定義しました。スレッド内にテイクアンドプットするメソッドを使用しています。そして、時々私はそれらの間にテイクを入れて102回置くのを見ることに気づきました。なぜそれが起こるのですか?

これは、ブロッキングキューのキューに100を超えるエントリがあることを意味するのではなく、出力の競合状態の副産物である可能性があります。要素がキューに入れられた、スレッドがキューから何かを削除する可能性がありますが、パターがメッセージを表示する"removed"にメッセージを表示します。その逆も同様です。キュー呼び出しの間にロックがないため、順序は保証されません。"added"System.out.println(...)

質問がある場合は、印刷しqueue.size()て100を超えるかどうかを確認してくださいArrayBlockingQueue。表示されることはありません。

于 2012-10-23T22:51:33.553 に答える