多线程的那点事儿(1)--如何选择线程数

  多线程向来是一个让程序员头痛的一个问题,不只是初学者容易犯错误,很多老鸟也难免站着中枪。一旦出现问题很难定位和解决,除了可能因为编程者知识上的缺陷导致的疏漏外,另一个难题就是问题重现难度大,避免多线程导致BUG最好的方法就是预防。

  首先,在开始进行多线程编程之前要考虑好,我们是否真的需要多线程,什么时候才需要多线程。正所谓”大道至简“,越简单的设计越是好的设计,如果单个线程就可以完成任务解决问题,就不要用多个线程,不要为了炫耀一下自己的多线程编程能力动不动就起个线程,到最好搞不好会搬石头砸自己的脚。那什么情况下才需要用多线程呢,如果满足以下两个条件之一就不得使用多线程:
  (1)单线程不能满足业务需要。例如12306的火车票售票系统,在同一时间内可能会有NNN个请求,这些请求之间是完全独立的,其发起时间也是没有相互依赖关系的,后台必须使用多线程处理以保证对用户响应的及时。

  (2)单线程不能满足性能要求且数据IO吞吐率低于CPU的处理能力。如果单个线程可以满足性能要求根据无须考虑多线程了,在对于访问IO较多的应用中,IO(无论是读写数据还是等待用户响应)会阻塞线程的运行,而CPU更多的时间处于等待外部响应的状态,此时增加线程可以提高CPU的利用率,当有线程在等待IO的时候有别的线程在使用CPU,从而通过提高CPU的利用率而提高应用的整体性能。

  其次,当确定了肯定要用多线程之后,紧接着就得考虑一个问题:用几个线程比较合适?主要可以从以下方面考虑:

  (1)业务逻辑。根据实际的业务不同要通过经验数据来确定线程的数量,很难有统一的公式计算出来,要通过不断的调整、测试、比较来确定一个比较合理的数字,而且随着业务的变更,参数还要重新调整。

  (2)CPU数量。如果只有一个CPU,在同一时间不可能执行两个线程的,它们是通过时间片的轮换来实现多线程的,而在线程间的不断切换时操作系统会有进行很多的操作,相当消费CPU资源,线程越多无谓的CPU消费也就越多。对于一个计算密集型的任务可能只用一个线程才是效率最高的,例如对大块内存数据的排序操作,没有任何IO会阻塞线程,使用多个线程只会无谓地消费CPU资源,只需要一个线程一直进行排序操作即可。要想发挥CPU的最佳性能,无论对任何类型的应用,线程的最小数量就是CPU的数量,如果此时CPU还有空闲再考虑增加线程的数量,不断调整以取得最佳的性能。

  (3)内存大小。因为每个线程都要分配独立的栈以及独立的上下文环境,所以创建一个新的线程之后即使什么也不干也会消耗一定的内存,故而并不是线程越多性能越好。因为如果创建的线程过多内存不够用,很可能导致程序在运行过程中有虚拟内存的使用,将内存的访问转化为低速存储的访问,反而会负面影响应用的性能。

  然而,这些因素只是影响确定线程数的重要因素,但并没有公式可使用,需要根据经验对这些因素进行评估并通过试验来确定最佳的线程数。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值