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运行任务