キューへのアクセスが必要な 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>());
なぜこれが機能しないのか疑問に思っていました。
この情報は、別のスタック オーバーフローの回答から取得しました。
正解の段落6で
キューに何かを入れるスレッドが 1 つしかなく、別のスレッドがキューから何かを取り出す場合、ConcurrentLinkingQueue はおそらくやり過ぎです。数百または数千のスレッドが同時にキューにアクセスする可能性がある場合に適しています。あなたのニーズは、おそらく以下を使用することで満たされるでしょう:
Queue<YourObject> queue = Collections.synchronizedList(new LinkedList<YourObject>());
これのプラスは、インスタンス (キュー) でロックされるため、複合操作の原子性を確保するためにキューで同期できることです (Jared が説明したように)。すべての操作は (java.util.concurrent.atomic 変数を使用して) インスタンスをロックせずに行われるため、ConcurrentLinkingQueue でこれを行うことはできません。キューが空のときにブロックする場合は、これを行う必要はありません。これは、キューが空のときに poll() が null を返すだけで、poll() がアトミックであるためです。poll() が null を返すかどうかを確認します。その場合は、wait() してから、再試行してください。ロックする必要はありません。
追加情報:
編集: Eclipse は役に立ちすぎないようにしようとしていたため、必要のない場所にブレーク ポイントの例外を追加することを決定し、ブレーク ポイントを配置するように求められませんでした。