并发基础之线程的生命周期
Posted chen88
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发基础之线程的生命周期相关的知识,希望对你有一定的参考价值。
线程六种状态详解
在Thread类中有一个枚举类型State定义了线程的六种状态,详细如下,下面来看一下线程的几种状态都是什么:
NEW
:代表已经创建但是还没启动的新线程RUNNABLE
:这是一种特殊的状态,一旦调用start方法就会线程就会运行就会进入RUNNABLE状态。RUNNABLE意思为可运行的,也就是说当我们调用start方法后但是CPU没有分配资源线程等待CPU分配资源这段时间也处于RUNNABLE状态。BLOCKED
:当一个线程进入一个被Syncronized
修饰的代码块的时候,并且该锁已经被其他线程拿走了,这时候状态是BLOCKED。WAITING
:等待。一般是没有设置参数的Object.wait()
等方法。TIMED_WAITING
:计时等待。一般是带参数的Object.wait()
等方法。TERMINATE
:一种是线程执行完毕正常结束run方法,还有一种是出现了未捕获的异常导致线程意外终止。
状态转换图示
状态转换代码演示
/**
* @author Chen
* @Description 演示线程的NEW RUNNABLE TERMINATED状态
* @create 2019-11-15 22:30
*/
public class NewRunnableTerminated implements Runnable{
public static void main(String[] args) {
Thread thread = new Thread(new NewRunnableTerminated());
//打印NEW状态
System.out.println(thread.getState());
thread.start();
//打印RUNNABLE状态
System.out.println(thread.getState());
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
//打印RUNNABLE状态,正在运行和等待cpu资源未真正运行时候RUNNABLE
System.out.println(thread.getState());
}
@Override
public void run() {
for (int i = 0; i <1000 ; i++) {
System.out.println(i);
}
}
}
/**
* @author Chen
* @Description 演示BLOCKED WAITING TIMED_WAITING状态
* @create 2019-11-15 22:43
*/
public class BlockedWaitingTimedWaiting implements Runnable{
public static void main(String[] args) {
BlockedWaitingTimedWaiting runnable = new BlockedWaitingTimedWaiting();
Thread thread1 = new Thread(runnable);
thread1.start();
Thread thread2 = new Thread(runnable);
thread2.start();
try {
Thread.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
//打印出Timed_Waiting状态,因为正在执行Thread.sleep(1000);
System.out.println(thread1.getState());
//打印出BLOCKED状态,因为thread2想拿得到sync()的锁却拿不到
System.out.println(thread2.getState());
try {
Thread.sleep(1300);
} catch (InterruptedException e) {
e.printStackTrace();
}
//打印出WAITING状态,因为正在执行
System.out.println(thread1.getState());
}
@Override
public void run() {
try {
syn();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private synchronized void syn() throws InterruptedException {
Thread.sleep(1000);
wait();
}
}
注意:
- 线程从NEW到RUNNABLE到TERMINATED是不可逆的,RUNABLE和其他三个状态是可以相互转换的。
- 状态之间不能跳跃,比如不能从NEW 之间跳到RUNNABLE,只能先运行到RUNNABLE状态才能在进行转换。
阻塞状态说明:一般把Blocked、Waiting、Timed_waiting都成为阻塞状态。因为这几个状态都类似于等待的状态,所以统称为阻塞。
以上是关于并发基础之线程的生命周期的主要内容,如果未能解决你的问题,请参考以下文章