【java开发多线程篇】之什么是线程池,常用的线程池有?好处和作用是什么?

256 阅读3分钟

前言: 多线程的知识点很多,也是面试必考点,必须要懂得如何运用,此文章仅代表鄙人的总结和理解,如有错漏,欢迎指正...

一、什么是线程池

线程池能有效的处理多个线程的并发问题,避免大量的线程因为互相强占系统资源导致阻塞现象,能够有效的降低频繁创建和销毁线程对性能所带来的开销,每次请求就创建一个线程,开销很大,创建和销毁都是需要时间的,在一个JVM里创建太多的线程可能会导致系统由于过度消耗内存而用完内存或“切换过度”。

二、如何合理的设置线程池数量

CPU密集型: 即该任务需要大量的运算,而没有阻塞,CPU一直全速运行。
IO密集型: 即该任务需要大量的IO,即大量的阻塞。

CPU密集型任务应配置尽可能小的线程,如配置CPU个数+1的线程数
IO密集型任务应配置尽可能多的线程,因为IO操作不占用CPU,不要让CPU闲下来

结论:
CPU密集型时,任务可以少配置线程数,大概和机器的cpu核数相当,这样可以使得每个线程都在执行任务
IO密集型时,大部分线程都阻塞,故需要的配置线程数 = 2*cpu核数

三、线程池的使用

最核心的类是ThreadPoolExecutor类,这个可以自己写实现(稍微复杂点,要自己传参配置),参数有:

1.corePoolSize(线程池基本大小)
2、maximumPoolSize(线程池最大大小)
3、keepAliveTime(线程存活保持时间)
4、workQueue(任务队列)
5、threadFactory(线程工厂)
5、handler(线程饱和策略)  

也可以使用下面现成的常用线程池实现

四、常用的线程池实现

1、newFixedThreadPool(正规线程),这是一个有指定的线程数的线程池,有核心的线程,里面有固定的线程数量,响应的速度快。正规的并发线程,多用于服务器。固定的线程数由系统资源设置。
2、newcaCheThreadPool(缓存线程池),只有非核心线程,最大线程数很大(Int.Max(values)),它会为每一个任务添加一个新的线程,这边有一个超时机制,当空闲的线程超过60s内没有用到的话,就会被回收。缺点就是没有考虑到系统的实际内存大小。
3、newSingleThreadPoll(单线程线程池),看这个名字就知道这个家伙是只有一个核心线程,就是一个孤家寡人,通过指定的顺序将任务一个个丢到线程,都乖乖的排队等待执行,不处理并发的操作,不会被回收。确定就是一个人干活效率慢。
4、newScheduleThreadPool(计划性线程池),是唯一一个有延迟执行和周期重复执行的线程池。它的核心线程池固定,非核心线程的数量没有限制,但是闲置时会立即会被回收。

五、execute()和submit()方法

1、execute(),执行一个任务,没有返回值。
2、submit(),提交一个线程任务,有返回值。


结语:以往都是看别人的博客进行学习技术,其中不乏有精华博客也有吊儿郎当的CV大法文章,所以决定将自己所学所用所整理的知识分享给大家,主要还是想为了后浪们少走些弯路,多些正能量的博客,如有错漏,欢迎指正,仅希望大家能在我的博客中学到知识,解决到问题,那么就足够了。谢谢大家!(转载请注明原文出处)