首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何测量有多少线程正在执行一段代码?

如何测量有多少线程正在执行一段代码?
EN

Stack Overflow用户
提问于 2017-12-13 22:22:17
回答 2查看 151关注 0票数 8

我正在尝试测量有多少线程同时执行一段代码。目前我正在(Ab)使用信号量,有没有更好的方法?

代码语言:javascript
运行
复制
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
EN

回答 2

Stack Overflow用户

发布于 2017-12-13 22:30:49

使用AtomicInteger而不是Semaphore

大致是这样的:

代码语言:javascript
运行
复制
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
票数 7
EN

Stack Overflow用户

发布于 2017-12-14 04:21:28

AtomicInteger是一个很好的建议,但是由于java-8已经有了LongAdder,它更适合竞争激烈的环境。

不同之处在于,当CAS失败时,AtomicInteger会再次尝试,直到成功为止。当LongAdder失败时(里面有一个自旋锁),它将创建一个“失败”的值的数组(如果我没记错的话,限制在CPU的数量)。当你最终请求它的当前值时-所有那些“失败”的值都会被添加到结果中。事实证明,这种策略比AtomicInteger快得多。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47795282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档