几种常用的线程池threadpool

我们知道一个系统一般不可能只有一个线程,而根据系统的服务器等硬件水平,我们可以合理的利用多线程来快速的完成我们所需要的功能。而对于系统而言,如果频繁的创建和销毁线程,也会给系统带来相当大的负担,所以我们平时都是利用线程池来解决这一点。

线程池的作用:

1)减少创建和销毁线程的次数,每个工作线程可以多次使用
2)可根据系统情况调整执行的线程数量,防止消耗过多内存


java的线程池都是来自executor接口,共有4种常见线程池,分别能适用于几种常见的系统,下面是executor的实现类threadpoolExecutor的 其中一个构造方法:

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler) 

其实这就是构造一个线程池所需要的所有参数了,我们来介绍一下这些参数:

corePoolSize:该线程池中核心线程的最大数量,核心线程其实很好理解,就是你创的线程不超过这个数量,就是核心线程,而超过了就不是核心线程了
int maximumPoolSize:线程池的最大线程数量 ,这个不用我说明了吧

long keepAliveTime:非核心线程的存货时间,也就是当一个非核心线程被创建,使用完归还给线程池它没有被利用一定时间,便会被销毁 
TimeUnit unit:上面的时间单位(时分秒)
BlockingQueue<Runnable> workQueue:该线程池的等待队列,当线程池满了,线程就会放入这个队列中,后面会详细讲一下这个队列满了的情况
ThreadFactory threadFactory:创建线程的方式(我也不太明白,但我没用过)
RejectedExecutionHandler handler:它是一个异常捕获器,专门用来抛异常
 

这就是创建一个线程池的所有参数了,下面是常用的四种线程池,它们都是基于Executor接口的实现类executor:

①newSingleThreadExecutor

单个线程的线程池,即线程池中每次只有一个线程工作,单线程串行执行任务,也就是说只有一个核心线程,所有操作都通过这一个线程来进行
②newFixedThreadExecutor(n)

固定数量的线程池,没提交一个任务就是一个线程,直到达到线程池的最大数量,然后后面进入等待队列直到前面的任务完成才继续执行
③newCacheThreadExecutor(推荐使用)

可缓存线程池,当线程池大小超过了处理任务所需的线程,那么就会回收部分空闲(一般是60秒无执行)的线程,当有任务来时,又智能的添加新线程来执行。
④newScheduleThreadExecutor

大小无限制的线程池,支持定时和周期性的执行线程


这就是常用的几种线程池了,下面说一下如果等待的任务超出了队列也就是blockingQueue的大小(其实很难超过),会发生什么:

如果线程池中的线程数量已经到达了线程池的最大容量,那么接续的任务会被放到blockingQueue中,这个队列是有大小限制的,如果超过了它的限制,那么blockingqueue会返回失败。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值