线程的创建开销大吗?线程创建开销包括哪些?线程池

5 篇文章 0 订阅

1-1. 关于时间,创建线程使用是直接向系统申请资源的,这里调用系统函数进行分配资源的话耗时不好说。 关于资源,Java线程的线程栈所占用的内存是在Java堆外的,所以是不受java程序控制的,只受系统资源限制,默认一个线程的线程栈大小是1M(当让这个可以通过设置-Xss属性设置,但是要注意栈溢出问题),但是,如果每个用户请求都新建线程的话,1024个用户光线程就占用了1个G的内存,如果系统比较大的话,一下子系统资源就不够用了,最后程序就崩溃了。

PS:同样的道理在java程序中也不要随意开启新的线程,特别是高频业务尽量使用线程池,不然很容易导致内存不足,程序崩溃的问题。

1-2. 对操作系统来说,创建一个线程的代价是十分昂贵的, 需要给它分配内存、列入调度,同时在线程切换的时候还要执行内存换页,CPU 的缓存被 清空,切换回来的时候还要重新从内存中读取信息,破坏了数据的局部性。

参考文章:线程创建开销包括哪些?

2-1.
完成一项任务的时间为T :
T1 创建线程的时间
T2 在线程中执行任务的时间,包括线程间同步所需时间
T3 线程销毁的时间
显然T = T1+T2+T3。注意这是一个极度简化的假设。可以看出T1,T3是多线程本身的带来的开销,我们渴望减少T1,T3所用的时间,从而减少T的时间。但一些线程的使用者并没有注意到这一点,所以在程序中频繁的创建或销毁线程,这导致T1和T3在T中占有相当比例。显然这是突出了线程的弱点(T1,T3),而不是优点(并发性)。

具体到数据,需要看你的系统要求。如果系统出现这样的情况就应该采用线程池!

你应该都比较常听过线程池,连接池的名词。这次都是池化技术。
为什么要将对象池化,因为这些对象是被经常使用的,比如线程,比如数据库连接;同时,频繁创建这些对象又是比较消耗资源(包括时间)的;还有个特点,这些对象虽然经常被使用但不是象一个循环一样一直在不间断运行,它是有间隔性的运行。
于是在系统运行一开始就创建一定数量的这样的对象,比如100个线程和100个数据库连接,将它们统一管理(利用一个管理对象来控制,我们可以把这个对象叫作线程池,连接池,对象池等),一旦系统需要这些对象的支持时,就由这个管理对象(线程池,连接池)返回一个没有被利用(没有运行业务代码的)对象来执行所需的要求。
这种技术就是池化。更多的可以看IBM的线程池教程。还有很多的开源项目都大量采用此类技术(来提高性能)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值