Java 线程的6种状态
不同于系统线程的5种状态,Java线程的6种状分别为
- 创建
- NEW
- 运行
- RUNNABLE
- BLOCKED
- WAITING
- TIMED_WAITING
- 结束
- TERMINATED
系统API文档
具体的例子
NEW
线程被创建,但是没有运行
//初始化一个对象,但是没有调用start()方法
Thread thread1 =new Thread("t1"){
@Override
public void run() {
System.out.println("running......");
}
};
System.out.println("T1 的状态是: "+ thread1.getState());
RUNNABLE
存在java虚拟机中,等待系统资源(比如CPU调度)其实就是正常运行
运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“RUNNABLE”,此时有可能分配了时间片,也有可能没有分配时间片.
//java 将 ready和running两种状态笼统的称为RUNNABLE
Thread thread2 =new Thread("t2"){
@Override
public void run() {
while (true){
}
}
};
thread2.start();
System.out.println("T2 的状态是: "+thread2.getState());
TERMINATED
线程生命周期结束,run方法之后自动释放
//线程结束自动结束
Thread thread3 =new Thread("t3"){
@Override
public void run() {
}
};
thread3.start();
BLOCKED 阻塞
凡是涉及到锁 的,大概率是BLOCK状态。
比如线程1等待线程2 释放锁
//6. 阻塞(BLOCKED):表示线程阻塞于锁。两个线程抢占同一个锁,没抢到锁的线程就会进行BLOCKED状态.
//代码解释:线程6和线程4有一个共同的特点就是给ThreadState.class进行了加锁,线程4的执行时间比较长,锁被线程4掌握, 这个时候线程6就会拿不到锁也就进人了BLOCKED状态
Thread thread6 =new Thread("t6"){
@Override
public void run() {
synchronized (example.class){
try {
Thread.sleep(909090);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
thread6.start();
WAITING
进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)
比如调用另一个线程的join方法
//5. 等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)
Thread thread5 =new Thread("t5"){
@Override
public void run() {
try {
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
thread5.start();
TIMED_WAITING
比如使用Thread.sleep(100000)使线程休眠了很久
它可以在指定的时间后自行返回
//超时等待(TIMED_WAITING) 可以在指定的时间自动返回
Thread thread4 =new Thread("t4"){
@Override
public void run() {
synchronized (example.class){
try {
Thread.sleep(9999999);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
thread4.start();
运行结果
图文理解
yield 和join的区别