3.1 观察线程的所有状态
java
package demo01;
public class ThreadState {
public static void main(String[] args) {
for (Thread.State state : Thread.State.values()) {
System.out.println(state);
}
}
}
-
NEW(新建) - 一个新创建但还未启动的线程处于这个状态。也就是说,当使用
new
关键字创建了Thread
对象后,但在调用其start()
方法之前,该线程就处于NEW状态。 -
RUNNABLE(可运行/运行中) - 当调用了线程的
start()
方法后,线程进入RUNNABLE状态。这意味着线程正在JVM中执行或者正准备开始执行,等待CPU时间片。这并不意味着线程一定正在运行,它也可能因为其他线程占用CPU而暂时没有执行。 -
BLOCKED(阻塞) - 一个线程尝试获取synchronized锁时如果锁已经被另一个线程持有,则当前线程会进入BLOCKED状态,直到它能够获得锁为止。此外,在等待I/O操作完成时也会进入此状态。
-
WAITING(无限期等待) - 如果线程调用了Object类的
wait()
方法、没有设定超时的Thread.join()
或LockSupport.park()
方法等,那么该线程将进入WAITING状态。这种状态下,线程不会被分配处理器时间,并且只有当其他线程显式地唤醒它(通过notify()
或notifyAll()
)或中断它时才会退出此状态。 -
TIMED_WAITING(计时等待) - 类似于WAITING状态,但是有一个指定的最大等待时间。比如通过带有超时参数的方法如
Thread.sleep(long millis)
、Object.wait(long timeout)
、带超时的Thread.join(long millis)
或LockSupport.parkNanos(long nanos)
等让线程进入此状态。一旦超时时间到达,即使没有被唤醒,线程也会自动从这个状态转换出去。 -
TERMINATED(终止) - 当run()方法正常返回或者由于未捕获异常导致线程停止运行时,线程进入TERMINATED状态。此时线程被认为已经"死亡",不能再重新启动。
-
观察:NEW、RUNNABLE、TERMINATED、状态的转换
java
package demo01;
public class ThreadStateTransger {
public static void main(String[] args) {
Thread t = new Thread(() -> {
for (int i = 0; i < 1000_0000; i++) {
}
}, "李四");
System.out.println(t.getName() + ":" + t.getState());
t.start();
while (t.isAlive()) {
System.out.println(t.getName() + ":" + t.getState());
}
System.out.println(t.getName() + ":" + t.getState());
}
}
-
观察:WAITING、BLOCKED、TIMED_WAITING 状态的转换
```java
package demo01;
public class Test {
public static void main(String[] args) {
final Object object = new Object();
Thread t1 = new Thread(() -> {
synchronized (object) {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}, "t1");
t1.start();
Thread t2 = new Thread(() -> {
synchronized (object) {
System.out.println("hello t2");
}
});
t2.start();
}
}
```
使用jconsole可以看到:
-
t1的状态是TIMED_WAITING
-
t2的状态是BLOCKED
-
结论:
-
• BLOCKED 表⽰等待获取锁, WAITING 和 TIMED_WAITING 表⽰等待其他线程发来通知.
-
• TIMED_WAITING 线程在等待唤醒,但设置了时限; WAITING 线程在⽆限等待唤醒