多线程与高并发(4)
Executor
一个接口,其定义了一个接收Runnable对象的方法execute
ExecutorService
是一个比Executor使用更广泛的子类接口,其提供了生命周期管理的方法,submit方法返回一个Future对象,并且可以传入Callable对象获取线程返回值
Callable
Callable的call方法带有返回值,Runnable的run没有返回值,而且Callable可以抛出异常
Future
Future也是一个接口,存储执行将来产生的结果
FutureTask
FutureTask实现于RunnableFuture接口,而RunnableFuture接口继承Runnable与Future接口。既是一个Runnable又可以存储线程执行结果
CompletableFuture
CompletableFuture可以管理多个Future的结果,并且提供了函数式编程,也提供了转换和组合 CompletableFuture 的方法。
线程池
维护2个队列,线程队列与任务队列
1.ThreadPoolExecutor
- corePoolSize:核心线程数
- MaxPoolSize:最大线程数
- KeepAliveTime:线程最大空闲时间
- TimeUnit:时间单位
- BlockingQueue:线程等待队列
- ThreadFactory:线程创建工厂
- RejectStrategy:拒绝策略
先消耗核心线程,如果核心线程都被占用,则进入线程等待队列,入队操作为原子性操作,队列满后,再创建非核心线程,如果非核心线程也全部被占用,则转入拒绝策略。
2.ForkJoinPoll
- 分解汇总的任务
- 用很少的线程可以执行很多的任务(子任务)TPE做不到先执行子任务
- CPU密集型
Executors - 线程池工厂
- SingleTgreadExecutor:保证线程顺序执行
- CachedThreadPool:最大线程数为Integer.MAX_VALUE,线程队列SynchronousQueue,如果队列中的线程不被消费会阻塞,corePoolSize为0表示线程全部为非核心线程,KeepAliveTime值为60秒未使用将被回收
- FixedThreadPool:固定大小的线程池,corePoolSize与MaxPoolSize值相等,表示全部为核心线程不会被回收
- ScheduledThreadPool:内部使用DelayedWorkQueue实现
- WorkStealingPool:工作窃取线程池,本质上是ForkJoinPool实现,
- ForkJoinPool:主要用于实现“分而治之”的算法,RecursiveTask带返回值 RecursiveAction不带返回值