我有2个线程需要访问队列,一个用于放置,一个用于获取。
起始值
public static Queue<WorldData> blockDestructionQueue = Collections.synchronizedList(new LinkedList<WorldData>());
使用上面的代码,我得到了一个类型不匹配:不能从List转换到Queue
我尝试将其强制转换为Queue,但这不起作用。
public static Queue<WorldData> blockDestructionQueue = (Queue<WorldData>)Collections.synchronizedList(new LinkedList<WorldData>());
我想知道为什么这不起作用。
我从另一个堆栈溢出答案中得到了这个信息。
如何使用ConcurrentLinkedQueue?
在正确答案第6段
如果你只有一个线程把东西放入队列,另一个线程从队列中取出东西,ConcurrentLinkingQueue是可能过分了。当你可能有几百甚至更多的时候数千个线程同时访问队列。你的需求可以使用:
Queue<YourObject> queue = Collections.synchronizedList(new LinkedList<YourObject>());
这样做的一个好处是它锁定了实例(队列),所以您可以在队列上同步以确保组合操作的原子性由Jared解释)。你不能在ConcurrentLinkingQueue中这样做,因为所有的操作都是在没有锁定实例的情况下完成的(使用java.util.concurrent.atomic变量)。你不需要这样做如果您想在队列为空时阻塞,因为poll()会当队列为空时,只需返回null, poll()是原子的。检查poll()是否返回null。如果是,则wait(),然后再尝试再一次。不需要锁
附加信息:
edit: Eclipse试图提供太多帮助,并决定在不需要的地方添加一个断点异常,并且没有被要求添加一个。
队列不是列表,Queue
也不是List
的实现,尽管您可以用列表实现队列。
看看BlockingQueue,它可能更适合你的需要:
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/BlockingQueue.htmlCollections.synchronizedList
返回一个不扩展Queue
的SynchronizedList
实例。LinkedList
是一个Queue
,但那不是你现在使用的。