Java多线程之线程状态的迁移详解
前言
在Java中,线程是一种轻量级的进程,它可以在一段程序中同时执行多条指令。线程的状态随着执行过程中不断发生变化,本文将详细介绍线程状态的迁移,从而让读者更好地理解线程的运行机制。
线程状态
Java线程的状态可以分为以下几种:
- 新建状态(New): 当Java线程还没有启动时,它的状态是New。
- 运行状态(Runnable): 当Java线程正在运行时,它的状态是Runnable。
- 阻塞状态(Blocked): 当Java线程在处于Runnable状态时,被某些原因阻断了运行,那么该线程的状态就是Blocked。
- 等待状态(Waiting): 当Java线程正在等待另一个线程执行完成,它的状态是Waiting。
- 超时等待状态(Timed_waiting): 当Java线程需要等待一段时间部分I/O操作完成或超时,它的状态就是Timed_waiting。
- 终止状态(Terminated): 当Java线程执行完毕或发生异常终止时,它的状态就是Terminated。
线程状态迁移
Java线程的状态在运行过程中会发生改变,以下是Java线程状态的一些典型转换:
- 新建状态 -> 运行状态:使用start()方法启动线程,就会将该线程的状态从New变为Runnable。
public class TestThread extends Thread {
public void run() {
System.out.println("线程正在运行...");
}
public static void main(String[] args) {
TestThread t = new TestThread();
t.start();
}
}
- 运行状态 -> 阻塞状态:当Java线程在执行过程中,被另外一个线程调用了sleep()、join()或wait()方法使线程进入等待状态时,该线程的状态由Runnable变为Blocked。
public class TestThread extends Thread {
public void run() {
System.out.println("线程开始运行...");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
TestThread t = new TestThread();
t.start();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("执行结束...");
}
}
- 阻塞状态 -> 运行状态:当一个处于阻塞状态的线程被sleep()、join()或wait()方法中的某一个条件满足时,该线程就会从Blocked状态变为Runnable状态,直到获取到了CPU时间片,再次开始执行。
public class TestThread extends Thread {
public synchronized void run() {
System.out.println("线程开始运行...");
try {
wait(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
TestThread t = new TestThread();
t.start();
synchronized (t) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
t.notify();
}
System.out.println("执行结束...");
}
}
4. 运行状态 -> 等待状态/超时等待状态:当Java线程在运行过程中,调用了wait()、join()或sleep()方法,在指定时间内没有取得响应时,线程的状态由Runnable变为Waiting或Timed_waiting状态。
```java
public class TestThread extends Thread {
public synchronized void run() {
System.out.println("线程开始运行...");
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
TestThread t = new TestThread();
t.start();
synchronized (t) {
System.out.println("等待2秒钟...");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
t.notify();
}
System.out.println("执行结束...");
}
}
5. 等待状态/超时等待状态 -> 运行状态:当一个处于等待状态或超时等待状态的线程被notify()或notifyAll()方法唤醒时,线程的状态由Waiting或Timed_waiting变为Runnable状态。
```java
public class TestThread extends Thread {
public synchronized void run() {
System.out.println("线程开始运行...");
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程重新获得CPU时间片...");
}
public static void main(String[] args) {
TestThread t = new TestThread();
t.start();
synchronized (t) {
System.out.println("等待2秒钟...");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
t.notify();
}
System.out.println("执行结束...");
}
}
6. 运行状态 -> 终止状态:当Java线程执行完毕或发生异常时,线程的状态由Runnable变为Terminated状态。
```java
public class TestThread extends Thread {
public void run() {
System.out.println("线程开始运行...");
}
public static void main(String[] args) {
TestThread t = new TestThread();
t.start();
System.out.println("线程执行结束...");
}
}
总结
线程的状态随着运行过程中不断发生改变,本文讲解了线程状态的迁移过程,并给出了多个示例代码,希望读者能够更深刻地理解Java线程的运行机制。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java多线程之线程状态的迁移详解 - Python技术站