1

キューへのアクセスが必要な 2 つのスレッドがあり、1 つは配置用、もう 1 つは取得用です。

だから私はイニシエーションを持っています

public static Queue<WorldData>          blockDestructionQueue   = Collections.synchronizedList(new LinkedList<WorldData>());

上記では、タイプの不一致が発生します:リストからキューに変換できません

キューにキャストしようとしましたが、うまくいきませんでした。

public static Queue<WorldData>          blockDestructionQueue   = (Queue<WorldData>)Collections.synchronizedList(new LinkedList<WorldData>());

なぜこれが機能しないのか疑問に思っていました。

この情報は、別のスタック オーバーフローの回答から取得しました。

ConcurrentLinkedQueue の使用方法

正解の段落6で

キューに何かを入れるスレッドが 1 つしかなく、別のスレッドがキューから何かを取り出す場合、ConcurrentLinkingQueue はおそらくやり過ぎです。数百または数千のスレッドが同時にキューにアクセスする可能性がある場合に適しています。あなたのニーズは、おそらく以下を使用することで満たされるでしょう:

Queue<YourObject> queue = Collections.synchronizedList(new LinkedList<YourObject>());

これのプラスは、インスタンス (キュー) でロックされるため、複合操作の原子性を確保するためにキューで同期できることです (Jared が説明したように)。すべての操作は (java.util.concurrent.atomic 変数を使用して) インスタンスをロックせずに行われるため、ConcurrentLinkingQueue でこれを行うことはできません。キューが空のときにブロックする場合は、これを行う必要はありません。これは、キューが空のときに poll() が null を返すだけで、poll() がアトミックであるためです。poll() が null を返すかどうかを確認します。その場合は、wait() してから、再試行してください。ロックする必要はありません。

追加情報:

編集: Eclipse は役に立ちすぎないようにしようとしていたため、必要のない場所にブレーク ポイントの例外を追加することを決定し、ブレーク ポイントを配置するように求められませんでした。

4

2 に答える 2

2

リストを使用してキューを実装することはできますが、キューはリストでQueueはなく、 の実装でもありませんList

BlockingQueue を見てください。おそらく必要なものにより適しています。

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/BlockingQueue.html

于 2013-03-17T20:38:06.023 に答える
0

Collections.synchronizedListSynchronizedListを拡張しないインスタンスを返しますQueueLinkedListですが、Queueそれはその時点で使用しているものではありません。

于 2013-03-17T20:40:06.430 に答える