1. 线程生命周期
● NEW、RUNNABLE、RUNNING、BLOCK、DEAD
2. 线程方法
2.1 线程启动
● 继承Thread类 或 实现Runnable接口
● 调用start()方法
2.2 线程终止
● 使用volatile或AtomicBoolean修饰变量作为状态值,在此状态改变时退出线程
● 使用线程的interrupt()方法,捕获InterruptedException异常时退出线程
● PS:不能使用线程的stop()方法立即终止,因为线程资源来不及释放,可能导致获取的锁无法释放、数据不一致等
3. 线程调度
3.1 Java线程调度
● JVM使用基于操作系统的抢占式调度,并结合Java的线程优先级管理
3.2 进程调度
3.2.1 优先调度
先来先服务调度
● 每次调度从就绪队列中选择最先进入该队列的进程,为之分配处理机,使之投入运行,该进程一直运行到完成或发生某事件阻塞后才放弃处理机
短作业优先调度
● 每次调度从就绪队列中选择估计运行时间最短的进程,分配处理机,立即执行一直到完成或发生某事件阻塞
3.2.2 高优先权优先
非抢占式优先权调度
● 每次调度从就绪队列中选择优先级最高的进程,执行到完成或阻塞
● 应用:批处理系统、对实时性要求不高的系统
抢占式优先权调度
● 每次调度从就绪队列中选择优先级最高的进程,执行过程中如果出现优先级更高的进程,原进程就立即停止,重新分配给新到的优先级更高的进程
● 应用:堆性能要去较高的批处理和分时系统
高响应比优先调度
● 解决问题:在短作业优先调度下,长时间作业始终得不到运行
● 满足短作业优先:如果作业的等待时间相同,则要求服务时间越短,优先权越高
● 满足先来先服务:如果作业的要求服务时间相同,则等待时间越长,优先权越高
● 满足长作业运行:如果长作业的等待时间足够长,则优先权会很高
● 缺点:每次调度之前需要计算响应比,增加系统开销
3.3.3 基于时间片的轮转调度
时间片轮转调度
● 系统将所有就绪进程按照先来先服务的顺序排队,每次调度让队首进程执行一个时间片,时间片用完时由计时器发出时钟中断请求,停止该进程的执行,并将其送至队尾,然后再选择就绪队列中新的队首进程
多级反馈队列调度
● 设置多个就绪队列,每个队列赋予不通的优先级。第一个队列优先级最高,第二个队列次之,由此逐级递减。每个队列执行的时间片逐级递增,优先级越高的队列,时间片越短
● 新进程进入后首先进入第一个队列的队尾,按照先来先服务的原则,如果未执行完成,则进入第二个队列的队尾,由此循环
● 仅当优先级较高的队列空闲时,才选择后一个队列进行调度
● 特点:优先级高的短作业可以在第一级队列快速处理完,长作业未处理完也可以进入第二级队列获得更长的执行时间。兼顾优先级和长短作业