Java 线程的状态及转换(Java线程状态详解及状态转换流程)
原创
一、Java 线程的基本概念
在Java中,线程是程序执行的基本单元。线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。Java中的线程是由java.lang.Thread类实现的。
二、Java 线程的状态
Java线程的生命周期中,共有6种状态。下面将分别介绍这些状态及其含义:
1. NEW(新建)
当创建一个Thread对象后,该线程就处于NEW状态。此时,线程尚未启动。
2. RUNNABLE(可运行)
当调用线程的start()方法后,线程进入RUNNABLE状态。在这个状态下,线程具备了执行的能力,但并不一定正在执行。线程也许会在任何时刻被操作系统调度执行,也也许被其他线程抢占。
3. BLOCKED(阻塞)
线程进入同步代码块或方法时,如果同步锁已经被其他线程持有,则该线程会进入BLOCKED状态,等待获取锁。
4. WAITING(等待)
当线程调用Object的wait()方法时,线程会进入WAITING状态。此时,线程会释放已经持有的锁,等待其他线程调用notify()或notifyAll()方法唤醒。
5. TIMED_WAITING(计时等待)
当线程调用Object的wait(long timeout)方法或Thread的sleep(long millis)方法时,线程会进入TIMED_WAITING状态。此时,线程会释放已经持有的锁,等待指定的时长后继续执行或被其他线程唤醒。
6. TERMINATED(终止)
当线程执行完毕后,线程会进入TERMINATED状态。此时,线程不再具备执行能力。
三、Java 线程状态的转换
下面将详细介绍Java线程状态的转换过程:
1. NEW -> RUNNABLE
创建Thread对象后,调用start()方法,线程从NEW状态转换到RUNNABLE状态。
public class MyThread extends Thread {
public void run() {
// 线程执行的操作
}
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start(); // 线程从NEW状态转换到RUNNABLE状态
}
}
2. RUNNABLE -> BLOCKED
线程尝试获取一个已经被其他线程持有的锁时,线程从RUNNABLE状态转换到BLOCKED状态。
public class MyThread extends Thread {
public synchronized void run() {
// 线程执行的操作
}
public static void main(String[] args) {
MyThread thread1 = new MyThread();
MyThread thread2 = new MyThread();
thread1.start(); // 线程1从NEW状态转换到RUNNABLE状态
thread2.start(); // 线程2尝试获取锁,从RUNNABLE状态转换到BLOCKED状态
}
}
3. BLOCKED -> RUNNABLE
当线程获取到锁后,线程从BLOCKED状态转换到RUNNABLE状态。
4. RUNNABLE -> WAITING
线程调用Object的wait()方法时,线程从RUNNABLE状态转换到WAITING状态。
public class MyThread extends Thread {
public synchronized void run() {
try {
wait(); // 线程从RUNNABLE状态转换到WAITING状态
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start(); // 线程从NEW状态转换到RUNNABLE状态
}
}
5. WAITING -> RUNNABLE
当其他线程调用notify()或notifyAll()方法时,线程从WAITING状态转换到RUNNABLE状态。
6. RUNNABLE -> TIMED_WAITING
线程调用Object的wait(long timeout)方法或Thread的sleep(long millis)方法时,线程从RUNNABLE状态转换到TIMED_WAITING状态。
public class MyThread extends Thread {
public synchronized void run() {
try {
Thread.sleep(1000); // 线程从RUNNABLE状态转换到TIMED_WAITING状态
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start(); // 线程从NEW状态转换到RUNNABLE状态
}
}
7. TIMED_WAITING -> RUNNABLE
当指定的等待时间到达或被其他线程唤醒时,线程从TIMED_WAITING状态转换到RUNNABLE状态。
8. RUNNABLE -> TERMINATED
线程执行完毕后,线程从RUNNABLE状态转换到TERMINATED状态。
四、总结
了解Java线程的状态及转换对于编写多线程程序非常重要。掌握线程的状态转换,能够帮助我们更好地分析程序中的线程行为,从而优化程序性能。在实际开发过程中,要尽量避免线程长时间处于等待或阻塞状态,减成本时间程序运行的快速。