2013-03-17 63 views
1

我有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>()); 

这样做的好处是,它锁定在实例(队列),这样你就可以 队列同步,以确保复合操作的原子(如 的解释贾里德)。由于所有操作都是在不锁定实例的情况下完成的(使用 java.util.concurrent.atomic变量),因此无法使用ConcurrentLinkingQueue执行此操作。如果您想在队列为空时阻塞,您将不需要执行此操作 ,因为poll()将在队列为空时仅返回null,而poll()为原子。 检查poll()是否返回null。如果是,请等待(),然后再次尝试 。无需锁定。

附加信息:

编辑:月食试图太有帮助,并决定将它并不需要,并没有要求把一个破发点的异常。

+0

“正确”的答案不一定完全正确。 – 2013-03-17 20:35:49

+0

列表不是队列 - 为什么不使用LinkedBlockingQueue;它是为这种模式而设计的。消费者将在列表为空时阻止。 – 2013-03-17 20:38:29

+0

我没有使用LinkedBlockingQueue的原因是由于他的帖子中的“正确”答案,其中LinkedBlockingQueue会比SyncronizedList更强烈 – JohnM 2013-03-17 20:55:50

回答

2

队列不是列表,Queue不是List的实现,尽管您可以使用列表实现队列。

看一看的BlockingQueue它可能是你需要的东西更适合:

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/BlockingQueue.html

+0

我试图实现这一点,但出现以下错误此行的多个标记 \t - 令牌语法错误 “(”,表达后 \t此令牌 \t预期 - 语法令牌 “(” 错误,表达后预计 \t此令牌公共静态的BlockingQueue \t \t \t blockDestructionQueue \t =的LinkedBlockingQueue (); – JohnM 2013-03-17 21:28:33

+1

不要忘了关键字'新',它非常非常重要。 ;) – 2013-03-17 21:31:01

+0

此外,一些StackOverflow新手建议 - 不要忘记upvote帮助你的答案,并接受答案,回答你的问题。 – 2013-03-17 21:32:36

0

Collections.synchronizedList返回SynchronizedList实例不延伸QueueLinkedListQueue但这不是你在那个时候使用的。