线程被创建后,有一个生命周期,下图是线程的生命周期详解。
  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方法而死亡。


 

java让线程等待 java线程等待时间_对象锁

 

 

 

 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();
    }
}

运行结果:

java让线程等待 java线程等待时间_对象锁_02

 

从案例可只

 

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

java让线程等待 java线程等待时间_java_03

 

 

 

BLOCKED(锁阻塞):

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