【问题标题】:Synchronized Queue?同步队列?
【发布时间】:2013-01-31 23:22:05
【问题描述】:

我有两个线程用于我正在制作的在线游戏。一个线程接收两个 X 和 Y 数字,另一个线程将 X 和 Y 数字发送给登录到服务器的每个人。基本上我需要一个队列,这将允许第一个线程将 2D 数组添加到队列中,并继续这样做,同时拉出数组并从队列中删除数组以用于发送到其他玩家。有没有办法做到这一点?我知道我需要一个同步队列,但是我如何同步一个,这叫阻塞队列吗?

总的来说,我需要一个同步的队列,这将允许两个线程将内容放入并取出内容。有可能吗?

-丹

【问题讨论】:

  • 你标记了blockingqueue,它不符合你的需求?
  • 任何 BlockingQueue 都符合规范。

标签: java synchronization thread-safety queue blockingqueue


【解决方案1】:

阻塞队列是这样一个队列:

  1. 向其中添加元素,在队列中没有可用空间的情况下阻塞调用者线程,直到元素被移除(被其他线程);
  2. 从中删除元素,在没有任何元素要删除的情况下阻塞调用者线程,直到它添加的元素(由其他线程)。

为了实现线程安全(虽然不一定是同步的)队列的功能,您通常会使用BlockingQueue 的实现之一,例如LinkedBlockingQueue

【讨论】:

  • 您添加的混乱多于清晰度(通过引入线程安全与同步点) - 这绝对是 BlockingQueue 的候选者。仅当需要客户端同步时才应使用同步的包装器。你的第二个例子又是一个 BQ - 所以为什么不推荐一个 BQ 以 .. 开头。
  • @Bhaskar 我同意 BQ 在这种情况下是推荐的选项,我将相应地编辑答案。但是,由于问题提到了 synchronized 队列,重要的是要澄清 thread-safety 实际上是必需的,而 LinkedBlockingQueue 不是同步的。
  • 等等为什么不能将阻塞队列用于线程安全队列? “java.util.concurrent.ConcurrentLinkedQueue”可以工作吗?
  • @DanielH, ConcurrentLinkedQueue => 不会在空/满条件下阻塞,但允许比任何阻塞队列更多的吞吐量/并发操作。取决于你的要求。 CLQ 和 BQ 都是线程安全的。
  • @DanielH a BQ 可以用作线程安全队列。实际上它必须是线程安全的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 1970-01-01
  • 2023-03-07
  • 2019-02-10
  • 2021-12-17
  • 2011-02-01
相关资源
最近更新 更多