在我的程序中,我有一个“发件人”和“接收器”线程,两者都作用于一个队列。
我已在班级中将我的队列定义为:
static Queue<my_class> queue = new LinkedList<my_class>();
但是,我认为我遇到了问题,因为我的Queues
未同步。在我的“接收器”线程中,我有时必须从队列中删除会影响“发件人”线程如何操作的项目。
我正在阅读BlockingQueues
并且想知道这是否是我在我的情况下需要使用的内容?如果是这样,我该如何更改声明?我是否还需要在“发件人”和“接收者”主题中声明BlockingQueue
?
BlockingQueue
是否确保在任何给定时间只有一个线程访问队列?
抱歉,我对同步的概念很陌生,我发现它很混乱......
感谢您的帮助。
答案 0 :(得分:0)
您需要在接收器中声明BlockingQueue
,以便它可以使用take
方法;发件人仍然可以使用Queue
方法使用offer
声明,但如果您想使用BlockingQueue
方法,则需要声明offer(E e, long timeout, TimeUnit unit)
。
大多数BlockingQueue
实现实际上是无锁的,这意味着一个线程可以添加到它,而另一个线程同时从它获取线程(无锁实现通常比使用锁的实现更具可伸缩性)。无论实现如何,BlockingQueue
都是线程安全的。
答案 1 :(得分:0)
主要优点是BlockingQueue提供了正确的线程安全实现。这个运行时实现由并发专家开发,审查和维护。
阻塞队列是一个队列,当您尝试从队列中出队并且队列为空时阻塞,或者如果您尝试将项目排入队列并且队列已满。尝试从空队列中出队的线程被阻塞,直到某个其他线程将项目插入队列。尝试将整个队列中的项排入队列的线程将被阻塞,直到某个其他线程在队列中腾出空间,方法是将一个或多个项目出列或完全清除队列。