1

我有 2 个线程需要访问队列,一个用于放置,一个用于获取。

所以我有一个启蒙

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

有了上面我得到一个类型不匹配:无法从列表转换为队列

我尝试将其投射到队列中,但这不起作用。

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(),然后再试一次。无需锁定。

附加信息:

编辑:Eclipse 试图太有帮助,并决定在不需要且不要求放置的地方添加一个断点异常。

4

2 回答 2

2

队列不是列表,aQueue也不是 的实现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 回答