java并发编程-线程池

为什么要用线程池

  1. 降低资源消耗
  2. 提高响应速度 T1: 线程创建的时间 T2:工作任务运行额时间 T3: 线程销毁时间
  3. 提高了线程的可管理性
    在这里插入图片描述

ThreadPoolExecutor

corePoolSize: 核心线程数;如果执行的线程数大于核心线程数, 则会先进入到阻塞队列里
maxinumPoolSize:允许最大线程数; 线程池所创建的线程数一定小于这个值
keepAliveTime:空闲线程所存活的时间
TimeUnit:keepAliveTime 的时间单位
workQueue: 阻塞队列
threadFactory:线程工厂,给每个新建的线程命名, 缺省的线程命名规则:pool数字+thread 数字
RejectedExectionHandler:饱和策略。 阻塞队满了, 没有空闲线程时的处理方法
1.AbortPolicy:直接抛出异常 默认
2.CallerRunsPolicy: 调用者所在的线程来执行任务
3.DiscardOldestPolicy:丢弃最老的任务
4.DiscardPolicy:直接丢弃的任务

都不满足时, 可以使用RejectExecutionHandler接口自定义保护和策略

线程池的使用:
核心线程数是2 , 满了之后, 又启动了2 个线程(因为最大线程数是4), 虽然最终是6 个任务, 但是只启动了4 个线程来执行
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

FixedThreadPool : 使用固定线程数的线程池。

SignleThreadExecutor: 单个线程

有6 个任务只创建一个线程来执行
在这里插入图片描述

CachedThreadPool: 缓冲线程池 。 无上限的创建线程 最佳场景, 每个任务都非常短, 度熬到创建一个新县城所需要的时间

有6 个任务, 就创建了6 个线程
在这里插入图片描述

在这里插入图片描述

WorkStealingPool()(jdk1.7 以后):工作密取

ScheduledThreadPoolExecutor()定期执行任务的线程

delay: 提交任务过多久之后才执行
在这里插入图片描述
scheduleAtFixedRate:固定时间间隔 循环执行
时间间隔60s
任务A 执行需要80s, 任务B 执行需要20 s, 任务C 执行需要50s
则A 执行的时间是, 0 -80s
B 执行的时间是: 81-100s(到100s 的时候已经执行完了, 但是时间间隔还有60-20=40s)
C 的执行时间是 140-190(还有60-50 的间隔时间)
任务D 再执行则是 200 开始

scheduleWithFixedDelay:固定延时间隔的循环执行
时间间隔是 60s

任务A 执行需要80s, 任务B 执行需要20 s, 任务C 执行需要50s
则A 执行的时间是, 0 -80s
B执行的时间是:(80+60)=140——160
C执行的时间是:(160+60)=220——270
任务D 再执行则是 270+60=230 开始

如果报异常, 我们处理了异常, 下个任务会继续执行, 如果没有则中断定时任务的机制

线程执行顺序:

当有任务需要执行时, 线程池先创建线程,放到核心线程里。 如果创建的线程数达到核心线程数 , 则将任务推荐阻塞队列, 如果阻塞队列也满了, 线程池继续创建线程来还行任务, 知道线程数达到最大线程。 如果最大线程数满了, 队列也满了, 进入饱和策略

扫描二维码关注公众号,回复: 6149083 查看本文章

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41572697/article/details/89413620