如何检查ArrayBlockingQueue是否被锁定或当前线程正在处理的队列元素?

问题描述

| 问候,我很好奇是否可以通过某种方式检查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。