为了解决执行服务的生命周期问题,Executor扩展了ExecutorService接口;
ExecutorService的生命周期有三种状态:运行、关闭和已终止;
### 主要API
* shutdown\(\):执行平缓关闭流程
* shutdownNow\(\):立即关闭
* awaitTermination\(\)
* invokeAll\(\)
#### **shutdown\(\)**
将线程池状态置为SHUTDOWN,并不会立即停止:
* 停止接收外部submit的任务
* 内部正在跑的任务和队列里等待的任务,会执行完
* 等到第二步完成后,才真正停止
#### **shutdownNow\(\)**
将线程池状态置为STOP。企图立即停止,事实上不一定:
* 跟shutdown\(\)一样,先停止接收外部提交的任务
* 忽略队列里等待的任务
* 尝试将正在跑的任务interrupt中断
* 返回未执行的任务列表
> 它试图终止线程的方法是通过调用Thread.interrupt\(\)方法来实现的,但是大家知道,这种方法的作用有限,如果线程中没有sleep 、wait、Condition、定时锁等应用, interrupt\(\)方法是无法中断当前的线程的。所以,ShutdownNow\(\)并不代表线程池就一定立即就能退出,它也可能必须要等待所有正在执行的任务都执行完成了才能退出。但是大多数时候是能立即退出的
shuntdownNow返回的Runnable对象可能与提交的Runnable对象并不相同;它们可能是被封装过的已提交的任务;
#### awaitTermination\(long timeOut, TimeUnit unit\)
当前线程阻塞,直到
* 等所有已提交的任务(包括正在跑的和队列中等待的)执行完
* 或者等超时时间到
* 或者线程被中断,抛出InterruptedException
然后返回true(shutdown请求后所有任务执行完毕)或false(已超时)
> shuntdown\(\)和awaitTermination\(\)效果差不多,方法执行之后,都要等到提交的任务全部执行完才停
#### shutdown\(\)&&shutdownNow\(\)
shutdownNow\(\)能立即停止线程池,正在跑的和正在等待的任务都停下了。这样做立即生效,但是风险也比较大;
shutdown\(\)只是关闭了提交通道,用submit\(\)是无效的;而内部该怎么跑还是怎么跑,跑完再停
#### shutdown\(\)&&awaitTermination\(\)
shutdown\(\)后,不能再提交新的任务进去;但是awaitTermination\(\)后,可以继续提交。
awaitTermination\(\)是阻塞的,返回结果是线程池是否已停止(true/false);shutdown\(\)不阻塞
【知识点】
* 优雅的关闭,用shutdown\(\)
* 想立马关闭,并得到未执行任务列表,用shutdownNow\(\)
* 优雅的关闭,并允许关闭声明后新任务能提交,用awaitTermination\(\)
关闭功能【从强到弱】依次是:shuntdownNow\(\) > shutdown\(\) > awaitTermination\(\)
- 简介
- 概述
- 进程vs线程
- 资源限制
- 有关并行的两个定律
- 线程同步和阻塞
- 线程阻塞
- 线程的特性
- 守护线程
- 线程异常
- Thread
- 线程状态
- 线程中断
- wait¬ify
- suspend&resume
- join&yield
- notify¬ifyAll
- Thread.sleep
- 线程任务
- Runnable
- Callable
- Future模式
- FutureTask
- 线程实现方式
- 内核线程实现
- 用户线程实现
- 混合实现
- Java线程的实现
- java与协程
- 纤程-Fiber
- 线程调度
- 多线程协作方式
- 阻塞
- 放弃
- 休眠
- 连接线程
- 线程估算公式
- 线程活跃性
- 死锁
- 线程安全性
- 对象的发布与逸出
- 构造方法溢出
- 线程封闭
- 对象的可变性
- 原子性
- 原子操作
- CPU原子操作原理
- 总线锁
- 缓存锁
- JAVA如何实现原子操作
- long和double读写操作原子性
- Adder和Accumulator
- 线程性能
- 同步工具类
- 闭锁
- CountDownLatch
- FutureTask
- 信号量
- 栅栏
- CyclicBarrier
- Exchanger
- 并发编程
- volatile
- synchronized
- 无锁
- 偏向锁
- 轻量级锁
- 锁的优缺点对比
- 锁升级
- 锁消除
- Monitor
- synchronized语法
- Mutex Lock
- synchronized实践问题
- synchronized&ReentrantLock
- Lock
- ReentrantLock
- Condition
- 读写锁
- ReadWriteLock
- StampedLock
- 线程池
- Executor
- ExecutorService
- Executors
- ThreadPoolExecutor
- RejectedExecutionHandler
- ThreadFactory
- 线程池大小公式
- 动态调整线程池大小
- Fork/Join框架
- ForkJoinPool
- CompletableFuture
- JUC并发工具包
- LockSupport
- 延时任务与周期任务
- Timer
- TimerTask
- 异构任务并行化
- CompletionService
- volatile和synchronized比较
- 锁优化
- 锁相关概念
- 悲观锁(排它锁)
- 乐观锁
- 自旋锁
- 乐观锁vs悲观锁
- JVM锁优化-锁消除
- ThreadLocal
- InheritableThreadLocal
- TransmittableThreadLocal
- ThreadLocalRandom
- 无锁
- AtomicInteger
- Unsafe
- AtomicReference
- AtomicStampedReference
- AtomicIntegerArray
- AtomicIntegerFieldUpdater
- 无锁Vector
- LongAdder
- LongAccumulator
- 常见锁类型
- 悲观锁&独占锁
- 乐观锁
- 乐观锁vs悲观锁
- 自旋锁vs适应性自旋锁
- 公平锁vs非公平锁
- 可重入锁vs非可重入锁
- 独享锁vs共享锁
- 互斥锁
- CAS
- AQS介绍
- AQS深入剖析
- AQS框架
- AQS核心思想
- AQS数据结构
- 同步状态State
- ReentrantLock vs AQS
- AQS与ReentrantLock的关联
- ReentrantLock具体实现
- 线程加入等待队列
- 等待队列中线程出队列时机
- 如何解锁
- 中断恢复后的执行流程
- ReentrantLock的可重入应用
- JUC中的应用场景
- 自定义同步工具
- CLH锁
- 并发框架
- Akka
- Disruptor-无锁缓存框架
- 常见面试题
- 两个线程交替打印A和B
- 附录