线程池线程数过多引起的问题

1.创建更多的线程会消耗更多的内存(这个大家都知道);
2.线程数过多,会引起频繁的线程上下文切换。那么,这个该怎么理解呢?我会结合以下代码给大家举一个例子。

synchronized (this.getClass()){
	doSomething();
}

假如,现在服务器只有一个cpu,有3个线程a,b,c,并发执行这段代码。a抢到锁时,bc还没有真正的阻塞,因为bc不知道a抢到锁了。那么,什么时候知道呢?bc获取到cpu分配的时间片后,继续向下运行,直到发现this.getClass()的对象头中已经有了锁的信息,然后bc被添加到等待队列,这时开始阻塞。在这期间,cpu将资源分配给bc线程(上下文切换),而bc两个线程除了抢锁、等待并没有做其他实质性的工作,白白浪费了cpu资源。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
线程池是一种管理和复用线程的机制,它可以提高多线程应用程序的性能和效率。在线程池中,核心数和最大线程数是两个重要的参数。 核心数(Core Pool Size)指的是线程池中保持活动状态的线程数量。当有新的任务提交到线程池时,如果核心线程数还没有达到设定的值,线程池会创建新的线程来执行任务,即使有其他空闲线程可用。 最大线程数(Maximum Pool Size)指的是线程池能够容纳的最大线程数量。当有新的任务提交到线程池时,如果核心线程数已满且工作队列也已满,线程池会创建新的线程来执行任务,直到达到最大线程数。超过最大线程数的任务会根据线程池的拒绝策略进行处理。 区别在于,核心数是线程池一直保持的活动线程数量,即使这些线程处于空闲状态。而最大线程数线程池能够容纳的最大数量,包括了空闲和正在执行任务的线程。当任务数量超过核心数时,最大线程数的设置决定了是否创建新的线程来执行任务。 合理地设置核心数和最大线程数对于线程池的性能和资源管理非常重要。如果设置的核心数过小,可能会导致任务排队等待执行,影响性能。如果设置的最大线程数过大,可能会消耗过多的系统资源,甚至引起系统崩溃。因此,需要根据具体的应用场景和系统资源情况来进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值