线程池 ThreadPoolExcutor和ForkJoinPool

Excutor
  • 执行器接口,execute是执行方法,
  • 使定义和运行可以分开,运行的方式可以自己去定义
ExcutorService
  • 除了执行任务之外,还完善了整个任务执行的生命周期
  • submit方法为异步方法,返回值为Future,Future中的get可以获取线程执行的返回值,如果没有返回值,该方法会阻塞
CompletableFuture
  • 各种线程任务的管理类
  • 提供了四个静态方法来创建一个异步操作,以及四个计算完结果后的回调方法
线程池
  • 线程池分为两类,分别是ThreadPoolExcutor和ForkJoinPool
  • ThreadPoolExcutor是多线程用同一个任务队列,多线程取任务执行
  • ForkJoinPool是会把一个大任务切分成很多的小任务,最后汇总,可以有返回结果,也可以没有
  • 创建线程时指定线程名称可以方便出错时回潮,线程池中默认有指定
  • 使用ThreadPoolExcutor可自定义线程池,其中有七个参数
    ○ corePoolSize - 核心线程数
    ○ maximumPoolSize - 最大线程数
    ○ keepAliveTime - 空闲线程的存活时间,剩到核心线程的时候就不在归还
    ○ unit - 存活时间的时间单位
    ○ workQueue - 任务队列,也就是各种不同的BlockingQueue,用来装任务
    ○ threadFactory - 线程工厂,需要继承ThreadFactory接口,自定义产生线程的方法
    ○ handler - 拒绝策略,线程池忙而且任务队列满,会执行拒绝策略。JDK默认提供四种 ,可以自己定义
  • ForkJoinPool
    ○ 传入的任务为特殊任务ForkJoinTask
    ○ 继承RecursiveAction实现,为没有返回值的任务
    ○ 继承RecursiveTask实现,为有返回值的任务
拒绝策略
  • Abort:抛异常
  • Discard:扔掉任务,不抛异常
  • DiscardOldest:扔掉排队时间最久的任务
  • CallerRuns:调用者处理任务,也就是给传任务线程自己解决
  • 自定义拒绝策略,需要实现接口RejectedExecutionHandler
Excutors
  • 线程池的工厂
  • SingleThreadPool - 只有一个线程的线程池,相比与直接创建线程的优点时可以管理生命周期,有任务队列
  • CachedPool - 最大线程数是Integer的Max,有任务来时只要没有空闲线程,就创建一个线程
  • FixedThreadPool - 核心线程数就是最大线程数,等待时间为0,线程数是固定的
  • ScheduledPool - 任务队列是DelayQueue,放定时任务线程池
  • WorkStealingPool - 每个线程都有自己单独的队列,当某个线程执行完队列中的任务后,会去其他线程的队列中拿任务来执行
  • WorkStealingPool底层是创建了一个ForkJoinPool,其他线程池底层都是ThreadPoolExcutor
线程池底层
  • Worker类:任务类,既是Runnable也是 AQS,用Runnble给任务封了一层,本身就是一把锁
  • execute:添加任务的方法,有线程时直接运行,没有线程时放去queue中,queue满了执行拒绝策略
  • addWorker:外层自旋使count++ ,内层自旋添加任务,加锁用start运行任务
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值