12.2 线程状态
线程可以有6种状态:
- New(新建)
- Runnable(可运行)
- Blocked(阻塞)
- Waiting(等待)
- Timed waiting(计时等待)
- Terminated(终止)
确定当前线程的状态,只需要调用getState()方法。
12.2.1 新建线程
当new创建一个线程时,线程还未运行,意味着它的状态是新建(new)。
12.2.2 可运行线程
调用start方法,线程处于可运行(runnable)状态,可能正在运行也可能还没有运行。
抢占式争夺CPU的时间片。
java.lang.Thread 1.0
- static void yield(),是当前正在执行的线程向另一个线程交出运行权,这是静态方法。
12.2.3 阻塞和等待线程
阻塞或等待,此时不活动,不运行任何代码,消耗资源最小,有线程调度器重新激活这个线程。
- 一线程试图获取一内部对象锁(并发包中的Lock),此锁被其他线程占有,该线程会被阻塞,当其他线程都释放了这个锁,并且线程调度器允许该线程持有这个锁时,它将变成非阻塞状态。
- 等待状态,当前线程等待另一个线程通知调度器出现一个条件,调用Object.wait方法或Thread.join方法,或者等待java.util.concurrent库中的Lock或Condition会出现,实际上阻塞和等待状态区别不大。
- 有几个方法有超时参数,调用这些会让线程进入计时等待(timed waiting)状态。这一状态一直保持到超时期满或接收到适当的通知,带有超时参数的方法有Thread.sleep和计时版的Object.wait、Thread.join、Lock.tryLock以及Condition.await。
线程状态图
12.2.4 终止线程
以下两个原因终止:
- run方法正常退出,现成自然终止
- 因为一个没有捕获的异常终止了run方法,使线程意外终止。
java.lang.Thread 1.0
- void join(),等待终止指定的线程。
- void join(long millis)等待指定的线程终止或者等待经过指定的毫秒数。
- Thread.State getState() 5,得到这个线程的状态,取值为NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WATING,TERMINATED.
- void stop(),停止该线程,这个方法已废弃。
- void resume(),恢复线程,这个方法只能调用suspend()之后,该方法已废弃。