我有一个ArrayBlockingQueue,它与数据库有几个连接。许多线程试图通过轮询从它获得连接。队列中可用的最大连接数为50,在50之后,线程必须等待连接被放回以获取与数据库的连接。
问题是我无法获得在此ArrayBlockingQueue上等待获取数据库连接的线程数。我查看了那些似乎与我想要的东西无关的文档,因为想要获取数据库连接的任务是线程我不知道如何手动计算等待数据库连接的任务数。
感谢任何帮助。
答案 0 :(得分:2)
不使用反射,我唯一能想到的就是拦截对ABQ中任何poll / remove方法的调用。你可以扩展ABQ,有一些计数器在调用它的超级对应物之前递增,然后最终递减。
private final AtomicInteger count = new AtomicInteger(0);
// if you are using Java 8 I would prefer LongAddr
public T poll(){
count.incrementAndGet();
try {
return super.poll()
}finally{
count.decrementAndGet();
}
}
答案 1 :(得分:1)
将ArrayBlockingQueue
包含在您自己的类中以进行测试,并在课程中设置AtomicInteger
。
当新线程等待时递增AtomicInteger
,当一个线程结束时递减它。
您现在可以随时记录或查看AtomicInteger
的值。