目录
1.isAlive()观察线程NEW,RUNNABLE,TERMINATED状态
3.观察WAITING,BLOCKED,TIMED_WAITING状态
(3) TIMED_WAITING和BOLCKED状态下的代码逻辑
一.初始Java线程的所有状态
1.输出所有状态名
由于线程的抢占式执行,所以线程就存在了不同的状态,在Java中有个枚举类型的类,存在所有线程状态的名称;如下所示:
2.所有状态解释
- NEW: 安排了工作, 还未开始行动(初始化)
- RUNNABLE: 可工作的. 又可以分成正在工作中和即将开始工作(就绪/运行)
- BLOCKED: 这几个都表示排队等着其他事情(阻塞)
- WAITING: 这几个都表示排队等着其他事情(阻塞)
- TIMED_WAITING: 这几个都表示排队等着其他事情(阻塞)
- TERMINATED: 工作完成了(结束)
3.线程的状态和转移图解
二.通过Java程序观察线程状态
1.isAlive()观察线程NEW,RUNNABLE,TERMINATED状态
注意:除了NEW和TERMINATED状态外,其他状态线程都处于存活状态
代码:
public class StatusName {
public static void main(String[] args) {
Thread thread = new Thread(()->{
for (int i = 0; i < 10_0000; i++) {
}
},"线程1");
System.out.println(thread.getName()+": "+thread.getState());
thread.start();
while (thread.isAlive()) {
//thread线程存活,就执行下面代码
System.out.println(thread.getName()+": "+thread.getState());
}
System.out.println(thread.getName()+": "+thread.getState());
}
}
2.使用jre中的jconsole来观察线程状态
运行程序后(前提是程序不能一瞬间就运行完,这样就观察不到需要观察线程的状态),在idea中点击terminal并在控制台输入jconsole就可以进行连接,如下图所示:
进入后以不安全状态连接
3.观察WAITING,BLOCKED,TIMED_WAITING状态
(1)WAITING状态下代码逻辑
(2)线程WAITING状态
(3) TIMED_WAITING和BOLCKED状态下的代码逻辑
(4) TIMED_WAITING和BOLCKED状态
(5)代码
public class StatusName {
static Object locker = new Object();
public static void main(String[] args) throws InterruptedException {
Thread thread1 = new Thread(()->{
synchronized (locker) {
while (true) {
try {
//waiting状态
// locker.wait();
//timed_wating状态
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
}
}
},"线程1");
thread1.start();
Thread.sleep(3000);
Thread thread2 = new Thread(()->{
synchronized (locker) {
System.out.println("thread2");
}
},"线程2");
thread2.start();
}
}
(6)三种状态解释说明
BLOCKED :等待获取锁
WAITING 和 TIMED_WAITING :等待其他线程发来通知
TIMED_WAITING: 线程在等待唤醒,但设置了时限; WAITING 线程在无限等待唤醒