为什么要使用线程池
- 降低资源消耗
重复利用已创建的线程降低线程创建和销毁造成的消耗。 - 提高响应速度
当任务到达时,任务可以不需要等到线程创建就能立即执行。 - 提高线程的可管理性
线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控
白话理解线程池
线程的创建和销毁的代价很大,我们不能无限制的创建和销毁线程,那么就需要一个合适的方式去获取线程,比如,预先创建好一些线程,统一管理,用到的时候就取一个,用完就归还,线程不够的时候就先把任务存到一个队列中,有空闲的线程就开始执行。
如何使用线程池
既然能理解为什么要使用线程池,那么,不同场景对线程池的要求也就不一样了。那么如何合理的使用线程池呢?
我们可以做个预算,很简单的以时间来评定的话(当然实际场景可能不会这么简单),线程创建消耗为t1,线程销毁的消耗为t2,任务耗时为t3。那么一个任务的消耗评估为t1+t2+t3。
这种情况下,评估一个任务是否值得使用线程池就可以理解为t1+t2与t3的时间的比。当t3远小于t1+t2时,频繁创建销毁线程池会带来更大的损耗。当消耗相反的情况下,在需要使用的时候再去创建线程是更好的选择,这样能更合理的让计算机的线程资源在其他地方得到更好的应用。
小结
高并发,低耗时 使用固定数量的线程,在Java中可以考虑fixedthreadpool
低并发,高耗时 使用cachedthreadpool,当需要的时候再去创建线程,尽量把空闲时候的计算机资源让给其他应用使用
高并发,高耗时 将任务转换为以上两种的情况再去处理。比如,分到多台服务器,每台服务器的处理就变成了低并发,高耗时的方案
网友评论