我有 2 个线程需要访问队列,一个用于放置,一个用于获取。
所以我有一个启蒙
public static Queue<WorldData> blockDestructionQueue = Collections.synchronizedList(new LinkedList<WorldData>());
有了上面我得到一个类型不匹配:无法从列表转换为队列
我尝试将其投射到队列中,但这不起作用。
public static Queue<WorldData> blockDestructionQueue = (Queue<WorldData>)Collections.synchronizedList(new LinkedList<WorldData>());
我想知道为什么这不起作用。
我从另一个堆栈溢出答案中得到了这个信息。
在正确答案第 6 段中
如果您只有一个线程将内容放入队列,而另一个线程将内容从队列中取出,则 ConcurrentLinkingQueue 可能是矫枉过正。当您可能有数百甚至数千个线程同时访问队列时,它更有用。您的需求可能会通过使用来满足:
Queue<YourObject> queue = Collections.synchronizedList(new LinkedList<YourObject>());
这样做的一个优点是它锁定实例(队列),因此您可以在队列上同步以确保复合操作的原子性(正如 Jared 所解释的)。您不能使用 ConcurrentLinkingQueue 执行此操作,因为所有操作都是在没有锁定实例的情况下完成的(使用 java.util.concurrent.atomic 变量)。如果您想在队列为空时阻塞,则不需要这样做,因为 poll() 将在队列为空时简单地返回 null,而 poll() 是原子的。检查 poll() 是否返回 null。如果是,wait(),然后再试一次。无需锁定。
附加信息:
编辑:Eclipse 试图太有帮助,并决定在不需要且不要求放置的地方添加一个断点异常。