【问题标题】:How to check if ArrayBlockingQueue is locked or queue element currently processed by thread?如何检查 ArrayBlockingQueue 是否被锁定或线程当前处理的队列元素?
【发布时间】:2011-05-23 16:21:43
【问题描述】:

您好,我很好奇是否有办法检查 ArrayBlockingQuery 查询当前是否被锁定? 原因:我有一个服务器,它监听一个套接字,接收参数,处理它们,然后将一些结果返回给客户端。该服务器(假设它是服务器 A)在处理参数时打开与其他服务器(服务器 B)的会话,然后向 B 发送信息。连接到 B 时只能创建一个会话,但 A 可以接受多个客户端连接。因为 ArrayBlockingQueue 用于存储参数,其他一些线程通过队列运行并将它们一一发送给 B。

我需要执行该功能 - 当 ArrayBlockingQueue 为空并且当前没有处理任何内容并且客户端数据发送到 A 然后立即处理 - 将数据发送到 B 服务器,处理来自 B 的响应,然后如果 ArrayBlockingQuery 则 A 返回响应给客户端不为空并且处理了某些内容,然后只需将参数添加到队列并将其他响应从 A 发送到客户端。这就是为什么我需要知道是否有办法检查 ArrayBlockingQueue 是否被锁定或线程当前正在处理的队列元素。

谢谢!

【问题讨论】:

  • 你的意思是ArrayBlockingQueue 吗?
  • 是的,我的意思是 ArrayBlockingQueue 感谢您指出我的错误。
  • 如果您仅依靠队列为空来做出“处理或委托”决定,它将永远保持为空,因为对于每个下一个请求,您仍然会发现队列为空并且“立即处理” "。

标签: java multithreading queue


【解决方案1】:

你有什么理由不只使用锁,因为它是为保护一次只能在一个线程中使用的资源而设计的。

// in a client connection thread
lock.lock();
try {
    // use connection to server B
} finally {
    lock.unlock();
}

这确保服务器 B 一次只能在一个线程中使用,您无需向队列添加任何内容。


不知道ArrayBlockingQuery 是什么,谷歌也不知道。你的意思是ArrayBlockingQueue?

一个 ArrayBlockingQueue 没有被锁定很长时间,所以这个信息不是很有用。但是你可以通过反射获得锁。

您似乎在考虑您的解决方案。

您希望确保服务器 B 一次只能获得一个连接,并且您正在使用队列来执行此操作,但是您想绕过它,但这意味着一次丢弃您的连接.

【讨论】:

    【解决方案2】:

    我建议不要实施您所描述的内容。它会使代码变得更加复杂,并且除非您同步大部分内容并真正考虑您在做什么,否则它将为竞争条件开放。始终以相同的方式处理所有事件要好得多,即始终是队列,即使“工作线程”空闲也是如此。然后它将出列并照常工作。

    但是,您的问题可以通过让“工作线程”更新/使用Semaphore 来解决。然后您可以检查是否已获取信号机。 (通过检查可用的许可证)

    【讨论】:

      【解决方案3】:

      如果你的意思是ArrayBlockingQueue,它有一个(非阻塞的)peek() 方法

      检索但不删除此队列的头部,如果此队列为空,则返回 null。

      【讨论】:

      • 值得注意的是,这只是告诉你当时队列是空的。它不会告诉你队列仍然是空的,也不会告诉你是否有另一个线程正在处理前一个条目的信息。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-20
      • 1970-01-01
      • 1970-01-01
      • 2012-07-09
      相关资源
      最近更新 更多