线程池

线程池


1、产生的原因:说起线程池的产生我们必须首先了解线程的运行机制。那么什么是线程的运行机制呢?简单来说线程是怎么进行工作的?其实在我们计算机系统中,操作系统为每一个运行的线程安排一定的cup时间去处理这个线程,而这个cup时间的专业术语叫做时间片,所以cup其实在不断的切换时间片来循环的执行线程任务,由于cup的执行效率非常快,所以感觉就像多个线程在同时执行一样。但是对于单核的cup,同一个时刻只能处理单个线程,是不可能同时执行多个线程的。只有对于多核cup才有可能同时执行多个线程。所以我们知道了线程的运行过程,其实质就是cup在不断的切换线程来执行,这种循环的操作就会产生线程的不断创建和不断销毁,这样必然会浪费cup的资源,造成系统的效率变低,所以就有了线程池的产生。

2、线程池的概念:线程池其实就是预先产生线程的一种技术,将线程优先创建好放在一个类似于池子的容器中,当cup需要使用的时候直接从线程池中拿取,就避免了不断创建和销毁线程产生的浪费了。同时在效率上有了提高,线程执行的时间上也减少了。

3、线程池涉及的类:
Executor : java中线程池的顶级接口
ExecutorService: 真正的线程池接口
ScheduledExecutorService:周期执行的任务
ThreadPoolExecutor : ExecutorService的默认实现
ScheduledThreadPoolExecutor: ScheduledExecutorService接口的实现,周期性任务的类
Executors:可以一行代码创建一些常见的线程池

4、线程池分类:
newSingleThreadExecutor:单线程的线程池
newFixedThreadPool:固定大小的线程池
newCacheThreadPool:可缓存的线程池
newScheduledThreadPool:周期性执行不限大小的线程池

5、ThreadPoolExecutor的介绍(理解构造方法中参数的含义)
//构造方法
public ThreadPoolExecutor(int corePoolSize,//核心池的大小
                              int maximumPoolSize,//线程池最大线程数
                              long keepAliveTime,//保持时间
                              TimeUnit unit,//时间单位
                              BlockingQueue<Runnable> workQueue,//任务队列
                              ThreadFactory threadFactory,//线程工厂
                              RejectedExecutionHandler handler) //异常的捕捉器

6、线程池相关的方法
isShutdown():判断线程池是否关闭
isTerminated():判断线程池中的任务是否执行完毕
shutdown() : 调用后不再接收新任务,如果里面有任务,就执行完
shutdownNow() : 调用后不再接受新任务,如果有等待任务,移出队列;有正在执行的,尝试停止之
submit() : 提交执行任务
execute() : 执行任务

7、任务提交给线程池之后的处理策略
如果当前线程池中的线程数目小于corePoolSize,则每来一个任务,就会创建执行这个任务;
如果当前线程池中的线程数目>=corePoolSize,则每来一个任务,会尝试将其添加到任务缓存队列当中
         若添加成功,则该任务会等待空闲线程将其取出去执行;
          若添加失败(一般来说是任务缓存队列已满,针对的是有界队列),则会尝试创建新的线程去执行这个任务;
如果当前线程池中的线程数目达到maximumPoolSize,则会采取任务拒绝策略进行处理;
如果线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止,直至线程池中的线程数目不大于corePoolSize;如果允许为核心池中的线程设置存活时间,那么核心池中的线程空闲时间超过keepAliveTime,线程也会被终止。

8、阻塞队列的介绍(BlockingQueue)
   简介:阻塞队列,如果BlockingQueue是空的,从BlockingQueue取东西的操作将会被阻断进入等待状态,直到BlockingQueue进了东西才会被唤醒,同样,如果BlockingQueue是满的,任何试图往里存东西的操作也会被阻断进入等待状态,直到BlockingQueue里有空间时才会被唤醒继续操作。   
分类:
ArrayBlockingQueue --> 有界队列
LinkedBlockingQueue --> 无界队列
PriorityBlockingQueue --> 优先级队列
SynchronousQueue --> 交替队列

9、RejectedExecutionHandler介绍
ThreadPoolExecutor.AbortPolicy
当添加任务出错时的策略捕获器,如果出现错误,则直接抛出异常
ThreadPoolExecutor.CallerRunsPolicy
当添加任务出错时的策略捕获器,如果出现错误,直接执行加入的任务
ThreadPoolExecutor.DiscardOldestPolicy
当添加任务出错时的策略捕获器,如果出现错误,移除第一个任务,执行加入的任务
ThreadPoolExecutor.DiscardPolicy
当添加任务出错时的策略捕获器,如果出现错误,不做处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值