线程相关问题

为什么要使用线程池?
当你需要限制你应用程序中同时运行的线程数时,线程池非常有用。因为启动一个新线程会带来性能开销,每个线程也会为其堆栈分配一些内存等。为了任务的并发执行,我们可以将这些任务任务传递到线程池,而不是为每个任务动态开启一个新的线程。

线程池出现的原因在于创建某种对象的代价太高,而且该对象又需要反复使用。对于大多数网络服务器,他们都有共同点就在于单位时间内必须处理数目巨大的连接请求,但处理时间却相对较短。传统的多线程方案是接收到客户请求后,创建一个新的线程,等到任务执行完毕后,线程退出。也就是即时创建即时销毁的策略。
虽然创建线程的小号比创建进程的消耗相比已经很小的。但是如果执行的次数机器频繁,服务器处于不停的创建线程、销毁线程凡人新婚啥意思,会占据线程周期的CPU很大一部分比例。线程池采用与常见的技术,启动时创建一定数量的线程N1,放入空闲队列,当N1个线程都在使用时,则会创建新的线程在池中,当系统比较空闲时,线程池会自动销毁一部分线程,回收系统资源。通过这种预创建技术,线程池将线程创建和销毁的开销分摊到每个具体的任务上,执行次数越多,每个任务分担的线程开销也越小。

线程池是适用于需要大量的线程来完成任务,且完成任务的时间都比较短;对性能小球苛刻的应用,如服务器要求迅速响应客户请求,另外线程池技术适用于接受突发大量请求。

而对于长时间任务,因为线程创建和销毁时间相比任务执行时间可以忽略不计,就没有必要使用线程池了。

线程池中的线程数量是依据什么确定的?
在StackOverflow上面发现了一个还不错的回答,意思是:
线程池中的线程数量最直接的限制因素是中央处理器(CPU)的处理器(processors/cores)的数量N:如果你的CPU是4-cores的,对于CPU密集型的任务(如视频剪辑等消耗CPU计算资源的任务)来说,那线程池中的线程数量最好也设置为4(或者+1防止其他因素造成的线程阻塞);对于IO密集型的任务,一般要多于CPU的核数,因为线程间竞争的不是CPU的计算资源而是IO,IO的处理一般较慢,多于cores数的线程将为CPU争取更多的任务,不至在线程处理IO的过程造成CPU空闲导致资源浪费,公式:最佳线程数 = CPU当前可使用的Cores数 * 当前CPU的利用率 * (1 + CPU等待时间 / CPU处理时间)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值