浅度了解线程池

1.为什么要用线程池

提高线程的可控性

降低系统的资源消耗

2. 如何创建使用线程池

1.创建一个固定长度的,可控制线程最大数,超出线程最大数就会等待(newFixedThreadPool)

2.(JDK1.8)之后会根据并发数来动态创建和关闭线程。能够合理的使用CPU进行对任务进行并发操作,所以适合使用在耗时的任务上。(newWorkStealingPool)有返回值(ForkJoinPool):解释

使用一个无线队列来保存需要执行的任务,可传入线程数量…

3.创建一个可缓存的线程池,可灵活回收空闲线程,如无回收,即创建新的线程。(newCachedThreadPool)

4.创建一个单线程的线程池(newSingerThreadExecutor)

5.创建一个定长线程池,支持定时及周期性任务执行(newScheduledThreadPool)

3.Executor结构分析

定义:一个运行新任务的简单接口

ExecutorService

AbstractExecutorService:扩展了Executor接口。添加了一些用来管理执行器生命周期和任务生命周期的方法

ThreadPoolExecutor :Java线程池的核心实现。

ThreadPoolExecutor源码分析
// AtomicInteger是原子类  ctlOf()返回值为RUNNING;
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
// 高3位表示线程状态
private static final int COUNT_BITS = Integer.SIZE - 3;
// 低29位表示workerCount容量
private static final int CAPACITY   = (1 << COUNT_BITS) - 1;

// runState is stored in the high-order bits
// 能接收任务且能处理阻塞队列中的任务
private static final int RUNNING    = -1 << COUNT_BITS;
// 不能接收新任务,但可以处理队列中的任务。
private static final int SHUTDOWN   =  0 << COUNT_BITS;
// 不接收新任务,不处理队列任务。
private static final int STOP       =  1 << COUNT_BITS;
// 所有任务都终止
private static final int TIDYING    =  2 << COUNT_BITS;
// 什么都不做
private static final int TERMINATED =  3 << COUNT_BITS;

// 存放任务的阻塞队列
private final BlockingQueue<Runnable> workQueue;
线程池的五种状态

在这里插入图片描述

4.线程池中的几种重要的参数

corePoolSize就是线程池中的核心线程数量,这几个核心线程,只是在没有用的时候,也不会被回收

maximumPoolSize就是线程池中可以容纳的最大线程的数量

keepAliveTime,就是线程池中除了核心线程之外的其他的最长可以保留的时间,因为在线程池中,除了核心线程即使在无任务的情况下也不能被清 除,其余的都是有存活时间的,意思就是非核心线程可以保留的最长的空闲时间,

util,就是计算这个时间的一个单位。

workQueue,就是等待队列,任务可以储存在任务队列中等待被执行,执行的是FIFIO原则(先进先出)。

threadFactory,就是创建线程的线程工厂。

handler,是一种拒绝策略,我们可以在任务满了之后,拒绝执行某些任务。

线程池的拒绝策略

当请求任务不断的过来,而系统此时又处理不过来的时候,我们需要采取的策略是拒绝服务。RejectedExecutionHandler接口提供了拒绝任务处理的自定义方法的机会。在ThreadPoolExecutor中已经包含四种处理策略。

AbortPolicy策略:该策略会直接抛出异常,阻止系统正常工作。

CallerRunsPolicy 策略:只要线程池未关闭,该策略直接在调用者线程中,运行当前的被丢弃的任务。

DiscardOleddestPolicy策略: 该策略将丢弃最老的一个请求,也就是即将被执行的任务,并尝试再次提交当前任务。

DiscardPolicy策略:该策略默默的丢弃无法处理的任务,不予任何处理。

除了JDK默认提供的四种拒绝策略,我们可以根据自己的业务需求去自定义拒绝策略,自定义的方式很简单,直接实现RejectedExecutionHandler接口即可。

						注解: 本文都是在其他文章上,在加上自己的理解总结而出的,有错欢迎大家指出。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值