我有2个线程需要访问队列,一个用于推送,一个用于获取。
所以我有一个启动
public static Queue<WorldData> blockDestructionQueue = Collections.synchronizedList(new LinkedList<WorldData>());
通过上面的我得到类型不匹配:无法从列表转换为队列
我尝试将它投射到队列但这不起作用。
public static Queue<WorldData> blockDestructionQueue = (Queue<WorldData>)Collections.synchronizedList(new LinkedList<WorldData>());
我想知道为什么这不起作用。
我从另一个堆栈溢出答案中得到了这些信息。
How to use ConcurrentLinkedQueue?
在正确答案第6段
如果你只有一个线程将东西放入队列,另一个 线程从队列中取出,ConcurrentLinkingQueue是 可能是矫枉过正。当你可能拥有数百甚至数百时,它更有用 成千上万的线程同时访问队列。您的需求 可能会通过使用:
来满足Queue<YourObject> queue = Collections.synchronizedList(new LinkedList<YourObject>());
这个的另一个原因是它锁定了实例(队列),所以你可以 在队列上同步以确保复合操作的原子性(如 Jared解释说。你不能用ConcurrentLinkingQueue做到这一点, 因为所有操作都是在没有锁定实例的情况下完成的(使用 java.util.concurrent.atomic变量)。你不需要这样做 如果你想在队列为空时阻塞,因为poll()会 只需在队列为空时返回null,并且poll()是原子的。 检查poll()是否返回null。如果是,请等待(),然后尝试 再次。无需锁定。
其他信息:
编辑:Eclipse试图提供太多帮助,并决定在不需要的地方添加一个断点异常,并且没有被要求放一个。
答案 0 :(得分:2)
队列不是列表,Queue
不是List
的实现,尽管您可以使用列表实现队列。
看看BlockingQueue,它可能更适合您的需求:
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/BlockingQueue.html
答案 1 :(得分:0)
Collections.synchronizedList
会返回SynchronizedList
的实例,但不会扩展Queue
。 LinkedList
是Queue
,但那不是您当时使用的内容。