sleep方法
- 首先会让线程从running状态进去到timed waiting(阻塞)状态。
- 其他线程如果使用interrupt方法打断正在睡眠状态的线程,这是sleep方法会抛出InterruptedException异常。
- 睡眠后的线程时runnable(可执行)状态,并不是直接执行的running状态。
- 建议使用TimeUnit的sleep代替Thread的sleep方法,TimeUnit是jdk1.5引入
yield方法
- 调用yield方法后,线程从running状态,进入到runnable(可运行)状态,让出cpu资源。
- 具体的实现还依赖于操作系统的任务调度器。
线程的优先级 优先级1~10,默认优先级5。
- 线程优先级会提示调度器优先调度该线程,但仅仅是个提示,调度器可以忽略。
- 如果cpu较忙,那么优先级高的线程会获得较多的时间片,当cpu闲时,优先级几乎没有作用
防止服务器cpu占用100%
- 使用sleep或yield方法,让出cpu的使用
- 可以使用wait或者变量的方式控制
- 不同的是,后两种都需要加锁,并且需要唤醒操作,一般适用同步场景。
- sleep适用于无需锁的场景
join方法
等待线程运行结束后,接着往下运行(同步)
interrupt方法
用来打断sleep(睡眠)或者runnable(正在运行)的线程,如果打断runnable(正在运行)的线程,会抛出InterruptedThreadException异常。
其他线程调用interrupt方法,并不会打断其线程,应在run方法内获取线程的interrupt值,来判断是否停止该线程。
isInterrupted方法
判断是否被打断,Thread有一个静态方法interrupted,判断当前线程是否被打断。方法类似,但是isInterrupted方法不会清除打断标记,interrupted会清除打断标记。
两阶段终止模式(Two Phase Termination)
在A线程中,终止B线程的运行,主要是给B线程一个安排后事的信号。
错误思路
- 不可以调用stop方法来停止线程,但如果该线程锁住了共享资源,那么杀死该线程后,因为没有释放锁,导致其他线程永远无法获得该共享资源
- 使用System.init(int)方法停止线程,导致整个进程停止。
park方法
LockSupport的静态方法,使当前线程锁住,直到调用Thread.interrupted方法,打断线程,并且不清楚打断标记,才可以继续执行。