前言
java多线程包含六种状态,分别是NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED。
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
一、线程的六种状态
- NEW:初始状态;在thread被new出来,但并没有调用start方法时,线程将处于这个状态。
- RUNNABLE:运行状态(又具体分成正在运行状态和准备状态);当我们执行start方法后,线程状态变成该状态。
- BLOCKED:阻塞状态;如果有其他线程持有锁,当该线程也要尝试拿锁的时候,就会进入到阻塞状态。
- WAITING:等待状态;执行wait,join,park等方法时,线程就会进入等待状态。进行特定的操作才能从等待状态回到RUNNABLE状态。
- TIMED_WAITING:有时间的等待状态;除了进行特定的操作解除等待外,还会因为时间到了自动解除等待。
- TERMINATED:结束状态。正常运行完,或者终止都会进入到这个状态。
二、常见的状态迁移代码
1、新建 -> 运行 -> 终止
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("thread1当前状态" + Thread.currentThread().getState().toString());
System.out.println("thread1执行了");
}
});
System.out.println("没有调用start方法的thread1线程状态" + thread1.getState().toString());
thread1.start();
Thread.sleep(2000);
System.out.println("等待2秒后线程状态" + thread1.getState().toString());
运行结果如下
没有调用start方法的thread1线程状态NEW
thread1当前状态RUNNABLE
thread1执行了
等待2秒后线程状态TERMINATED
2、新建 -> 运行 -> 等待 -> 终止
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread2当前状态" + Thread.currentThread().getState().toString());
}
});
System.out.println("thread2没调用start方法的线程状态" + thread2.getState().toString());
thread2.start();
System.out.println("thread2调用start方法后的线程状态" + thread2.getState().toString());
Thread.sleep(200);
System.out.println("等待200毫秒thread2的线程状态" + thread2.getState().toString());
Thread.sleep(1500);
System.out.println("等待1500毫秒,thread2的线程状态" + thread2.getState().toString());
运行结果如下
thread2没调用start方法的线程状态NEW
thread2调用start方法后的线程状态RUNNABLE
等待200毫秒thread2的线程状态TIMED_WAITING
thread2当前状态RUNNABLE
等待1500毫秒,thread2的线程状态TERMINATED
3、新建 -> 运行 -> 阻塞 -> 运行 -> 终止
Thread thread3 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (ThreadDemo.class) {
System.out.println("thread3当前状态" + Thread.currentThread().getState().toString());
}
}
});
synchronized (ThreadDemo.class) {
System.out.println("thread3没调用start方法的线程状态" + thread3.getState().toString());
thread3.start();
System.out.println("调用start方法后,thread3的线程状态" + thread3.getState().toString());
Thread.sleep(200);
System.out.println("等待200毫秒,thread3线程状态" + thread3.getState().toString());
}
Thread.sleep(300);
System.out.println("等待300后,线程状态" + thread3.getState().toString());
运行结果如下
thread3没调用start方法的线程状态NEW
调用start方法后,thread3的线程状态RUNNABLE
等待200毫秒,thread3线程状态BLOCKED
thread3当前状态RUNNABLE
等待300后,线程状态TERMINATED