我正在尝试测量有多少线程同时执行一段代码。 目前我(ab)使用信号量,有更好的方法吗?
final int MAX_THREADS = Integer.MAX_VALUE;
Semaphore s = new Semaphore(MAX_THREADS);
s.acquire(); // start of section
// do some computations
// track how many threads are running the section
trackThreads( (MAX_THREADS - s.availablePermits()) );
s.release(); // end of section
答案 0 :(得分:5)
使用AtomicInteger代替Semaphore
。
有些事情:
AtomicInteger count = new AtomicInteger();
count.getAndIncrement();
// do some computations
// track how many threads are running the section
trackThreads( count.get() );
count.getAndDecrement(); // end of section
答案 1 :(得分:3)
AtomicInteger
是一个很好的建议,但是从java-8开始,LongAdder
更适合高竞争环境。
不同之处在于当CAS
失败时,AtomicInteger
会再次尝试 - 直到它成功。 LongAdder
CAS
无法AtomicInteger
(内部有自旋锁),会创建一个“失败”值的数组(如果我没记错的话,限制为CPU的数量)。当您最终请求它的当前值时 - 所有这些“失败”值都会添加到结果中。这种策略证明比totalnum
快得多。
答案 2 :(得分:-2)
在Thread
课程中,有static
方法帮助您实现此目标
Thread.activeCount()