问候,如果有人检查ArrayBlockingQuery查询当前是否已被锁定,我很好奇? 原因是:我有一个服务器,它监听套接字,接收参数,处理它们然后将一些结果返回给客户端。该服务器(假设它是服务器A),同时处理参数打开与其他服务器(服务器B)的会话,然后发送信息到B.连接到B时只能创建一个会话,但A可以接受多个客户端连接。因为ArrayBlockingQueue用于存储那些参数,一些其他线程通过队列运行并逐个发送到B.
我需要执行该功能 - 当ArrayBlockingQueue为空并且当前时刻没有处理任何内容并且客户端数据发送到A然后立即处理 - 将数据发送到B服务器,处理来自B的响应然后如果是ArrayBlockingQuery则返回对客户端的响应不是空的并且处理了某些内容然后只需将参数添加到队列并将其他响应从A发送到客户端。这就是为什么我需要知道是否有办法检查ArrayBlockingQueue是否被锁定或队列元素当前是否由线程处理。
谢谢!
答案 0 :(得分:1)
您是否有任何理由不使用Lock,因为这是为了保护一次只能在一个线程中使用的资源。
// in a client connection thread
lock.lock();
try {
// use connection to server B
} finally {
lock.unlock();
}
这可确保服务器B一次只能在一个线程中使用,而您无需向队列添加任何内容。
不确定ArrayBlockingQuery
是什么,谷歌也不确定。你的意思是ArrayBlockingQueue
?
ArrayBlockingQueue未锁定很长时间,因此此信息不是很有用。但是你可以通过反射获得锁定。
您似乎在考虑解决方案。
您希望确保服务器B一次只获得一个连接,并且您正在使用队列来执行此操作,但是您希望绕过此方法,但这意味着一次丢弃您的一个
答案 1 :(得分:1)
我建议不要实施你所描述的内容。它会使代码变得更加复杂,除非你同步大部件,并且真正考虑你在做什么,否则它将为竞争条件打开。总是以相同的方式处理所有事件要好得多,即使“工作线程”处于空闲状态,总是排队。然后它将像往常一样出列并正常工作。
然而,通过让“工作线程”更新/使用Semaphore可以解决您的问题。然后,您可以检查是否已获得semaphone。 (通过检查可用的许可证)
答案 2 :(得分:0)
如果您的意思是ArrayBlockingQueue
,则它有一个(非阻塞)peek()
方法
检索但不删除此队列的头部,如果此队列为空,则返回null。