java 线程状态 详解

  线程被创建后,有一个生命周期,下图是线程的生命周期详解。
  java api java.lang.Thread.State 这个枚举中给出了六种线程状态,分别是: 

线程状态 导致状态发生条件
NEW(新建) 线程刚被创建,但是并未启动。还没调用start方法。
Runnable(
运行)
线程可以在java虚拟机中运行的状态,可能正在运行自己代码,也可能没有,这取决于操
作系统处理器。
Blocked(锁阻
)
当一个线程试图获取一个对象锁,而该对象锁被其他的线程持有,则该线程进入Blocked
态;当该线程持有锁时,该线程将变成Runnable状态。
Waiting(无限
等待)
一个线程在等待另一个线程执行一个(唤醒)动作时,该线程进入Waiting状态。进入这个
状态后是不能自动唤醒的,必须等待另一个线程调用notify或者notifyAll方法才能够唤醒。
Timed
Waiting(计时
等待)
waiting状态,有几个方法有超时参数,调用他们将进入Timed Waiting状态。这一状态
将一直保持到超时期满或者接收到唤醒通知。带有超时参数的常用方法有Thread.sleep
Object.wait
Teminated(
终止)
因为run方法正常退出而死亡,或者因为没有捕获的异常终止了run方法而死亡。


 

 

 

 

  Timed Waiting 计时等待 在java api中被描述为:一个正在限时等待另一个线程执行一个(唤醒)动作的线程处于这一状态。晦涩难懂,还是通过一个列子来理解下吧

在卖火车票的程序中,为了减少线程执行太快,现象不明显等问题,在run方法中添加了sleep方法,这样就可以强制当前线程暂停1s,减慢线程。当程序调用sleep方法后,线程就会进入 Timed Waiting 状态

 

public class MyThreaddemo1 extends Thread {
@Override
public void run() {
super.run();
for (int i=0;i<100;i++){
if (i%10==0){
System.out.println("---"+i);

}
System.out.println(i);
}
try {
Thread.sleep(1000);
System.out.print(" 线程睡眠1秒!\n");
} catch (InterruptedException e) {
e.printStackTrace();
}
}

public static void main( String[] args ) {
new MyThreaddemo1().run();
}
}

运行结果:

 

从案例可只

 

 1. 进入 TIMED_WAITING 状态的一种常见情形是调用的 sleep 方法,单独的线程也可以调用,不一定非要有协
作关系。
2. 为了让其他线程有机会执行,可以将Thread.sleep()的调用放线程run()之内。这样才能保证该线程执行过程
中会睡眠
3. sleep与锁无关,线程睡眠到期自动苏醒,并返回到Runnable(可运行)状态

 

 

 

  BLOCKED(锁阻塞):

  Blocked状态在API中的介绍为:一个正在阻塞等待一个监视器锁(锁对象)的线程处于这一状态。
我们已经学完同步机制,那么这个状态是非常好理解的了。比如,线程A与线程B代码中使用同一锁,如果线程A
取到锁,线程A进入到Runnable状态,那么线程B就进入到Blocked锁阻塞状态。
这是由Runnable状态进入Blocked状态。除此Waiting以及Time Waiting状态也会在某种情况下进入阻塞状态,而
这部分内容作为扩充知识点带领大家了解一下。

 

posted @ 2020-05-12 14:27  成子吃橙子  阅读(388)  评论(0编辑  收藏  举报