0

在我的程序中,我有一个“发送者”和“接收者”线程,它们都作用于一个队列。

我在课堂上将我的队列定义为:

static Queue<my_class> queue = new LinkedList<my_class>();

但是,我认为我遇到了问题,因为我Queues没有同步。在我的“接收者”线程中,有时我必须从队列中删除项目,这将影响“发送者”线程的运行方式。

我正在阅读BlockingQueues并想知道这是否是我需要在我的情况下使用的?如果是这样,我该如何更改我的声明?我是否还需要BlockingQueue在“发送者”和“接收者”线程中声明?

BlockingQueue确保在任何给定时间只有一个线程访问队列吗?

对不起,我对同步的概念很陌生,我觉得它很混乱..

谢谢您的帮助。

4

2 回答 2

0

您需要BlockingQueue在接收器中声明 a 以便它可以使用该take方法;发送者仍然可以在Queue其方法中使用声明,但如果要使用该方法,则offer需要声明 a 。BlockingQueueoffer(E e, long timeout, TimeUnit unit)

大多数BlockingQueue实现实际上是无锁的,这意味着一个线程可以添加到它,而另一个线程同时从中获取(无锁实现通常比使用锁的实现更具可扩展性)。无论实现如何,BlockingQueue都是线程安全的。

于 2013-06-04T01:23:35.563 回答
0

主要优点是 BlockingQueue 提供了正确的、线程安全的实现。此运行时实现由并发专家开发、审查和维护。

阻塞队列是一个队列,当您尝试从其中出列并且队列为空,或者您尝试将项目入队但队列已满时,该队列会阻塞。试图从空队列中出列的线程被阻塞,直到其他线程将项目插入队列。试图将一个项目排入一个完整队列的线程被阻塞,直到某个其他线程通过使一个或多个项目出队或完全清除队列来在队列中腾出空间。

于 2013-06-04T01:24:26.620 回答