如何衡量执行一段代码的线程数?

时间:2017-12-13 14:22:17

标签: java multithreading concurrency monitoring semaphore

我正在尝试测量有多少线程同时执行一段代码。 目前我(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

3 个答案:

答案 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()