目录
目标
一、线程有哪些状态
1、新建态(NEW):
2、可运行态(RUNNABLE):
3、终结态(TERMINATED):
4、阻塞态(BLOCKED):
5、等待态(WAITING):
6、有时限的等待(TIMED_WAITING):
1、获得有时限的wait(要释放锁)
2、调用线程的sleep方法(不释放锁)
二、按操作系统层面划分(五种状态)
三、线程池的核心参数(高频面试题)
1、corePoolSize(核心线程数):
2、maximumPoolSize(最大线程数目):
3、keepAliveTime(生存时间):
4、unit(时间单位):
5、workQueue
6、threadFactory(线程工厂):
7、handler(拒绝策略):
目标
- 掌握Java线程的状态
- 掌握Java 线程状态之间的转换
- 辨析两种说法,六种状态 vs五种状态
- 掌握线程池的主要参数
一、线程有哪些状态
新建态-->可运行态-->终结态(单向且不可逆)
1、新建态(NEW):
在新建一个线程时,它并不是一个真正的线程,只有在它调用了线程的start方法后,他就会由新建状态转换为可运行状态
2、可运行态(RUNNABLE):
这时候它真正与线程关联起来了,这时候它当中的代码就会交由操作系统分配给CPU执行。
3、终结态(TERMINATED):
线程真正走到了尽头,底层所关联的线程和关联的相关资源也会得到释放。
4、阻塞态(BLOCKED):
- 线程在运行时,可能会发生多个线程争抢同一把锁,获取锁失败的线程就会进入阻塞态。
- 在持锁线程释放锁的时候,就会唤醒阻塞的线程,然它们进行下一轮竞争锁的动作。
- 这一轮竞争锁成功的线程就会恢复为可运行态;失败的线程仍然阻塞。
5、等待态(WAITING):
- 线程在获得锁后去不满足条件,就会进入等待态,并且释放锁;在以后满足条件后再获得锁。
- 但是之后它要重新去争抢锁。
6、有时限的等待(TIMED_WAITING):
1、获得有时限的wait(要释放锁)
时间到了或者调用notify()都会唤醒。
2、调用线程的sleep方法(不释放锁)
只有时间到了才会唤醒
二、按操作系统层面划分(五种状态)
- 分到CPU时间的: 运行
- 可以分到CPU时间的: 就绪
- 分不到CPU时间的: 阻塞
注意:Java中的 RUNNABLE涵盖了就绪、运行、阻塞I/O
三、线程池的核心参数(高频面试题)
1、corePoolSize(核心线程数):
最多保留的线程数
2、maximumPoolSize(最大线程数目):
核心线程 + 救急线程
3、keepAliveTime(生存时间):
针对救急线程
4、unit(时间单位):
针对救急线程
5、workQueue
阻塞队列
6、threadFactory(线程工厂):
可以为线程创建时起个好名字
7、handler(拒绝策略):
(1)默认:ThreadPoolExecutor.AbortPolicy();
抛异常
(2) ThreadPoolExecutor.CallerRunsPolicy();
让调用者自己处理任务,此时为主线程调用submit
所以该任务由主线程处理
(3) ThreadPoolExecutor.DiscardPolicy();
直接丢弃任务,也不抛异常
(4) ThreadPoolExecutor.DiscardOldestPolicy();
把队列中最老的任务丢弃。