一、 线程
线程是进程的一个实体,是cpu调度、分配,可以独立运行的基本单位。
1. 线程的状态:
new 新建、runnable 就绪、running 运行、blocked 阻塞、dead 死亡。
2. 创建线程的方式
继承 thread 重写 run 、 实现 runnable 重写 run、 实现 callable 重写 call、线程池executor。
3. runnable 和 callable 的区别:
run 无返回值,且无法捕获异常,call有返回值,可以获取异常信息。
4. start 和 run 的区别
start 开启一个线程并调用run开始执行,run只是调用一个方法。
5. wait 和 sleep 区别
wait 来自 object类,释放锁,必须在同步代码块中用,不需要捕获异常
sleep 来自 thead类,不会释放锁,可以在任意地方使用,需要捕获异常。
二、线程池
避免重复创建已有线程执行任务,提高响应速度
1. 分类:
newCachedThreadPool : 创建一个可进行缓存重复利用的线程池。
newFixedThreadPool : 创建一个可重用固定线程数的线程池。
newSingleThreadExecutor : 创建一个使用单个worker 线程的线程池。
newSingleThreadScheduledExecutor : 创建一个单线程执行程序。
newScheduledThreadPool :创建一个线程池,延迟运行命令或者定期的执行。
newWorkStealingPool : 创建一个带并行级别的线程池。
2. 核心参数
corePoolSize:核心线程池的大小。
maximumPoolSize:线程池能创建线程的最大个数。
keepAliveTime:空闲线程存活时间。
unit:时间单位,为keepAliveTime 指定时间单位。
workQueue:阻塞队列,用于保存任务的阻塞队列。
threadFactory:创建线程的工程类。
handler:饱和策略(拒绝策略)。
3. 工作过程:
判断核心线程池是否满了,没有满则创建一个新的工作线程来执行任务,如果满了,则进入工作队列,判断工作队列是否满,如果没有满,则将线程放入工作队列,如果满了,则判断是否都在执行任务,如果不是则创建一个新的工作线程来执行,如果满了,则交给饱和策略。
4. 拒绝策略:
ThreadPoolExecutor.AbortPolicy : 丢弃任务,抛出异常。
ThreadPoolExecutor.DiscardPolicy:丢弃任务,不抛出异常。
ThreadPoolExecutor.DiscardOldestPolicy:丢弃最前面任务,重新执行。
ThreadPoolExecutor.CallerRunsPolicy:既不抛弃任务也不抛出异常,而是将某些任务
回退到调用者
5. 线程池关闭:
shutdownNow : 将线程池设为stop,尝试停止所有正在执行、未执行线程,返回等待执行任务的列表。
shutdown:将线程池设为shutdown,中断所有没有执行的线程。