44
55![ ] ( img/系统进程状态转换图.png )
66
7- - 就绪状态( ready) :线程正在等待使用 CPU,经调度程序调用之后可进入 running 状态。
8- - 执行状态( running) :线程正在使用 CPU。
9- - 等待状态( waiting): 线程经过等待事件的调用或者正在等待其他资源(如I /O)。
7+ - 就绪状态( ready) :线程正在等待使用 CPU,经调度程序调用之后可进入 running 状态。
8+ - 执行状态( running) :线程正在使用 CPU。
9+ - 等待状态( waiting): 线程经过等待事件的调用或者正在等待其他资源(如 I /O)。
1010
1111### Java 线程的六个状态
1212
@@ -26,12 +26,12 @@ public enum State {
2626
2727处于 NEW 状态的线程此时尚未启动。
2828
29- ** 关于 start() 的两个引申问题**
29+ ** 关于 ` start() ` 的两个引申问题**
3030
31- 1 . 反复调用同一个线程的 start() 方法是否可行?
32- 2 . 假如一个线程执行完毕(此时处于 TERMINATED 状态),再次调用这个线程的 start() 方法是否可行?
31+ 1 . 反复调用同一个线程的 ` start() ` 方法是否可行?
32+ 2 . 假如一个线程执行完毕(此时处于 TERMINATED 状态),再次调用这个线程的 ` start() ` 方法是否可行?
3333
34- 两个问题的答案都是不可行,在调用一次 start() 之后,threadStatus 的值会改变(threadStatus !=0),此时再次调用 start() 方法会抛出 IllegalThreadStateException 异常。比如,threadStatus 为 2 代表当前线程状态为 TERMINATED。
34+ 两个问题的答案都是不可行,在调用一次 ` start() ` 之后,threadStatus 的值会改变(threadStatus !=0),此时再次调用 ` start() ` 方法会抛出 IllegalThreadStateException 异常。比如,threadStatus 为 2 代表当前线程状态为 TERMINATED。
3535
3636#### RUNNABLE
3737
@@ -47,70 +47,70 @@ public enum State {
4747
4848调用如下 3 个方法会使线程进入等待状态:
4949
50- - Object.wait():使当前线程处于等待状态直到另一个线程唤醒它;
51- - Thread.join():等待线程执行完毕,底层调用的是 Object 实例的 wait 方法;
52- - LockSupport.park():除非获得调用许可,否则禁用当前线程进行线程调度。
50+ - ` Object.wait() ` :使当前线程处于等待状态直到另一个线程唤醒它;
51+ - ` Thread.join() ` :等待线程执行完毕,底层调用的是 Object 实例的 wait 方法;
52+ - ` LockSupport.park() ` :除非获得调用许可,否则禁用当前线程进行线程调度。
5353
5454#### TIMED_WAITING
5555
5656超时等待状态。线程等待一个具体的时间,时间到后会被自动唤醒。
5757
5858调用如下方法会使线程进入超时等待状态:
5959
60- - Thread.sleep(long millis):使当前线程睡眠指定时间;
61- - Object.wait(long timeout):线程休眠指定时间,等待期间可以通过 notify()/notifyAll() 唤醒;
62- - Thread.join(long millis):等待当前线程最多执行 millis 毫秒,如果 millis 为 0,则会一直执行;
63- - LockSupport.parkNanos(long nanos): 除非获得调用许可,否则禁用当前线程进行线程调度指定时间;
64- - LockSupport.parkUntil(long deadline):同上,也是禁止线程进行调度指定时间。
60+ - ` Thread.sleep(long millis) ` :使当前线程睡眠指定时间;
61+ - ` Object.wait(long timeout) ` :线程休眠指定时间,等待期间可以通过 ` notify()/notifyAll() ` 唤醒;
62+ - ` Thread.join(long millis) ` :等待当前线程最多执行 millis 毫秒,如果 millis 为 0,则会一直执行;
63+ - ` LockSupport.parkNanos(long nanos) ` : 除非获得调用许可,否则禁用当前线程进行线程调度指定时间;
64+ - ` LockSupport.parkUntil(long deadline) ` :同上,也是禁止线程进行调度指定时间。
6565
6666#### TERMINATED
6767
6868终止状态。此时线程已执行完毕。
6969
7070### 线程状态的转换
7171
72- ![ ] ( http://concurrent.redspider.group/article/01/imgs/%E7%BA%BF%E7%A8%8B%E7%8A%B6%E6%80%81%E8%BD%AC%E6%8D%A2%E5%9B%BE .png)
72+ ![ ] ( img/线程状态转换图 .png)
7373
7474#### BLOCKED 与 RUNNABLE 状态的转换
7575
7676#### WAITING 状态与 RUNNABLE 状态的转换
7777
78- ##### Object.wait()
78+ ##### ` Object.wait() `
7979
80- 调用 wait() 方法前线程必须持有对象的锁。
80+ 调用 ` wait() ` 方法前线程必须持有对象的锁。
8181
82- 线程调用 wait() 方法时,会释放当前的锁,直到有其他线程调用 notify()/notifyAll() 方法唤醒等待锁的线程。
82+ 线程调用 ` wait() ` 方法时,会释放当前的锁,直到有其他线程调用 ` notify()/notifyAll() ` 方法唤醒等待锁的线程。
8383
84- 需要注意的是,其他线程调用 notify() 方法只会唤醒单个等待锁的线程,如有有多个线程都在等待这个锁的话不一定会唤醒到之前调用 wait() 方法的线程。
84+ 需要注意的是,其他线程调用 ` notify() ` 方法只会唤醒单个等待锁的线程,如有有多个线程都在等待这个锁的话不一定会唤醒到之前调用 ` wait() ` 方法的线程。
8585
86- 同样,调用 notifyAll() 方法唤醒所有等待锁的线程之后,也不一定会马上把时间片分给刚才放弃锁的那个线程,具体要看系统的调度。
86+ 同样,调用 ` notifyAll() ` 方法唤醒所有等待锁的线程之后,也不一定会马上把时间片分给刚才放弃锁的那个线程,具体要看系统的调度。
8787
88- ##### Thread.join()
88+ ##### ` Thread.join() `
8989
90- 调用 join() 方法不会释放锁,会一直等待当前线程执行完毕(转换为 TERMINATED 状态)。
90+ 调用 ` join() ` 方法不会释放锁,会一直等待当前线程执行完毕(转换为 TERMINATED 状态)。
9191
9292#### TIMED_WAITING 与 RUNNABLE 状态转换
9393
94- ##### Thread.sleep(long)
94+ ##### ` Thread.sleep(long) `
9595
96- 使当前线程睡眠指定时间。需要注意这里的“睡眠”只是暂时使线程停止执行,并不会释放锁。时间到后,线程会重新进入 RUNNABLE 状态。
96+ 使当前线程睡眠指定时间。需要注意这里的“睡眠”只是暂时使线程停止执行,** 并不会释放锁** 。时间到后,线程会重新进入 RUNNABLE 状态。
9797
98- ##### Object.wait(long)
98+ ##### ` Object.wait(long) `
9999
100- wait(long) 方法使线程进入 TIMED_WAITING 状态。这里的 wait(long) 方法与无参方法 wait() 相同的地方是,都可以通过其他线程调用 notify() 或 notifyAll() 方法来唤醒。
100+ ` wait(long) ` 方法使线程进入 TIMED_WAITING 状态。这里的 ` wait(long) ` 方法与无参方法 ` wait() ` 相同的地方是,都可以通过其他线程调用 ` notify() ` 或 ` notifyAll() ` 方法来唤醒。
101101
102- 不同的地方是,有参方法 wait(long) 就算其他线程不来唤醒它,经过指定时间 long 之后它会自动唤醒,拥有去争夺锁的资格。
102+ 不同的地方是,有参方法 ` wait(long) ` 就算其他线程不来唤醒它,经过指定时间 long 之后它会自动唤醒,拥有去争夺锁的资格。
103103
104- ##### Thread.join(long)
104+ ##### ` Thread.join(long) `
105105
106- join(long) 使当前线程执行指定时间,并且使线程进入 TIMED_WAITING 状态。
106+ ` join(long) ` 使当前线程执行指定时间,并且使线程进入 TIMED_WAITING 状态。
107107
108108#### 线程中断
109109
110110简单介绍下 Thread 类里提供的关于线程中断的几个方法:
111111
112- - Thread.interrupt():中断线程。这里的中断线程并不会立即停止线程,而是设置线程的中断状态为 true(默认是 flase);
113- - Thread.interrupted():测试当前线程是否被中断。线程的中断状态受这个方法的影响,意思是调用一次使线程中断状态设置为 true,连续调用两次会使得这个线程的中断状态重新转为 false;
114- - Thread.isInterrupted():测试当前线程是否被中断。与上面方法不同的是调用这个方法并不会影响线程的中断状态。
112+ - ` Thread.interrupt() ` :中断线程。这里的中断线程并不会立即停止线程,而是设置线程的中断状态为 true(默认是 flase);
113+ - ` Thread.interrupted() ` :测试当前线程是否被中断。线程的中断状态受这个方法的影响,意思是调用一次使线程中断状态设置为 true,连续调用两次会使得这个线程的中断状态重新转为 false;
114+ - ` Thread.isInterrupted() ` :测试当前线程是否被中断。与上面方法不同的是调用这个方法并不会影响线程的中断状态。
115115
116116> 在线程中断机制里,当其他线程通知需要被中断的线程后,线程中断的状态被设置为 true,但是具体被要求中断的线程要怎么处理,完全由被中断线程自己而定,可以在合适的实际处理中断请求,也可以完全不处理继续执行下去。
0 commit comments