|
Java线程的几种状态
1. 线程的所有状态
- NEW: Thread对象创建出来了, 但是内核
PCB
还未创建, 还没有真正创建线程 (最初的状态) - TERMINATED: 内核
PCB
销毁了, 但是Thread对象还在 (最后的状态) - RUNNABLE:
就绪状态
, 可分成正在工作中和即将开始工作 (正在CPU上运行 or 在就绪队列中排队) - TIMED_WAITING: 按照一定的时间, 进行
阻塞 (sleep)
- WAITING: 特殊的阻塞状态, 调用
wait
- BLOCKED: 等待锁的时候进入
阻塞状态
2. 画图理解线程状态
3. 观察线程的状态
#
关注NEW, RUNNABLE, TERMINATED状态的转换
public class Test {
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(() -> {
for (int i = 0; i < 100000; i++) {
}
});
//t 开始之前 NEW
System.out.println(t.getState());
t.start();
//t 正在工作 RUNNABLE
System.out.println(t.getState());
t.join();
//t 结束之后, TERMINATED
System.out.println(t.getState());
}
}
#
关注WAITING, BLOCKED, TIMED_WAITING状态的转换
- TIMED_WAITING, 我们修改一下线程中的代码
public class Test {
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
});
t.start();
Thread.sleep(50);
//TIMED_WAITING
System.out.println(t.getState());
t.join();
}
}
# 注意 #
当前线程运行到sleep, 得到的状态是TIMED_WAITING
. 如果还未运行sleep, 得到的状态则是RUNNABLE
. 具体得到的是当前的哪个状态, 也是有一定的随机因素的, (毕竟程序在调度的时候具体执行顺序是不确定的)
- BLOCKED
public class Test {
public static void main(String[] args) throws InterruptedException {
final Object object = new Object();
Thread t = new Thread(new Runnable() {
@Override
public void run() {
synchronized (object) {
System.out.println("hello thread");
}
}
}, "t");
t.start();
}
}
使用 jconsole 可以看到 t 的状态是 BLOCKED
- WAITING
public class Test {
public static void main(String[] args) throws InterruptedException {
final Object object = new Object();
Thread t = new Thread(new Runnable() {
@Override
public void run() {
synchronized (object) {
try {
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}, "t");
t.start();
}
}
使用 jconsole 可以看到 t 的状态是 WAITING
|
以上就是今天要讲的内容了,希望对大家有所帮助,如果有问题欢迎评论指出,会积极改正!!