我该如何测量一段代码正在执行的线程数量?

7

我想要测量有多少个线程同时执行一段代码。目前,我正在(滥用)使用信号量来实现这一点,是否有更好的方法?

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
2个回答

7

使用 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

5

AtomicInteger是个不错的选择,但自从Java 8以来,有一个更适合高并发环境的LongAdder

它们的区别在于,当CAS失败时,AtomicInteger会一直重试,直到成功。而LongAdderCAS失败时(内部有自旋锁),将创建一个“失败”的值数组(如果我没记错的话,数量限制为CPU数)。当您最终请求其当前值时,所有这些“失败”的值都会被添加到结果中。这种策略证明比AtomicInteger快得多。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接