Java线程上下文切换开销大小与线程数量的关系?
在《Java并发编程的艺术》这本书的1.1.4章节"减少上下文切换实战"中举了一个例子,起初dump jboss进程时发现有300+个worker线程处于 waiting 状态,然后通过减少线程池的线程最大数量来减少处于 waiting 状态的线程数量,意思是这样就能减少上下文切换的次数了。
但是我有一点不太明白,如果大量线程处于 waiting 状态而请求数又少的话,那么OS从300个waiting线程中选一个处理请求跟从100个 waiting 线程中选一个不都是只有1次上下文切换吗;如果新到10个请求,那么无论你处于 waiting 的线程有多少,进行上下文切换的也只有个10个线程吧,线程数量多增加的是内存占用,跟调度开销有什么直接关系吗
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这个要看代码怎么写的了,看下面代码:
假设执行顺序这样的:
每一次从waiting到runnable都是一次context switch,从runnable 到 waiting也会产生context switch。在这个例子里,一共发生了100+99次。如果要想把线程2~101全部都执行完毕,那么就要产生100+99+...+2+1次context switch。
原因很简单,因为操作系统需要对线程进行维护的(而不论这个线程出于什么样的状态)
所以线程越多,操作系统的开销确实是越大的