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