线程的六种状态|8月更文挑战

184 阅读4分钟

这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战

| 作者:江夏

| CSDN:blog.csdn.net/qq_41153943

| 掘金:juejin.cn/user/651387…

| 知乎:www.zhihu.com/people/1024…

| GitHub:github.com/JiangXia-10…

本文大概1465字,建议阅读11分钟

前言

线程Thread具有六种状态,并且在任一刻只能是这6种状态中的某一种状态。并且这些状态可以通过java.lang.Thread.State来表示:

图片

线程的六种具体状态如下:

NEW

尚未启动的线程的状态。当使用new一个新线程时,如new Thread(r),但还没有执行start(),线程还没有开始运行,这时线程的状态就是NEW。

RUNNABLE

可运行线程的线程状态。当start()方法被调用时,线程就进入RUNNABLE状态。此时的线程可能正在运行,也可能没有运行

BLOCKED

受阻塞并且正在等待监视器锁的某一线程的线程状态。

以下的几种情况会使得线程进入阻塞状态:

1.等待某个操作的返回,例如IO操作,该操作返回之前,线程不会继续下面的代码。

2.等待某个“锁”,在其他线程或程序释放这个“锁”之前,线程不会继续执行。

3.等待一定的触发条件。

4.线程执行了sleep方法。

5.线程被suspend()方法挂起。

同样的一个被阻塞的线程在以下的几种情况下会被重新激活(即使其阻塞的条件得到了满足):

1.执行了sleep()方法,睡眠时间已到。

2.等待的其他线程或程序持有的“锁”已被释放。

3.正在等待触发条件的线程,条件得到满足。

4.执行了suspend()方法,被调用了resume()方法。

5.等待的操作返回的线程,操作正确返回。

WAITING

等待线程的线程状态。线程因为调用了Object.wait()方法或者Thread.join()方法而未能运行,就会进入WAITING状态。

TIMED_WAITING

具有指定等待时间的某一等待线程的线程状态。线程因为调用了Thread.sleep()方法或者加上超时值来调用Object.wait()或Thread.join()而未运行,则会进入TIMED_WAITING状态。

TERMINATED

已终止线程的线程状态。线程已运行完毕。它的run()方法已正常结束或通过抛出异常而结束。

可以通过Thread.getState()方法获得当前具体的状态类型:

public class ThreadDemo{
    public static void main(String[] args){
        Thread t1 = new Thread(new Runnable(){
        
            @Override
            public void run() {
                //获取当前线程
               Thread curThread = Thread.currentThread();
               System.out.println("当前现场的运行状态:"+curThread.getState());
               
               //当前线程休眠3秒
               try{
                curThread.sleep(3000);
               }catch(Exception e){
                   System.out.println("线程中断后的状态:"+curThread.getState());
               }
               
            }
        });
        System.out.println("线程未启动的状态; "+t1.getState());
        t1.start();
        System.out.println("线程启动后的状态; "+t1.getState());
        //使得线程中断继而执行完毕
        try {
            Thread.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        t1.interrupt();  
        System.out.println("线程执行完毕的状态; "+t1.getState());
    }
}

执行结果:

图片

 Waiting状态和TimedWaiting状态:

public class ThreadDemo2{
   public static Object object=new Object();
    public static void main(String[] args){
        Thread t = new Thread(new Runnable(){
            @Override
            public void run() {
                Thread currThread = Thread.currentThread();
                System.out.println(String.format("%s中同步代码块的状态:%s",currThread.getName(),currThread.getState()));
 
                synchronized(object){
                    try {
                        //waiting状态
                        object.wait();
                        //time-wait状态
                       // object.wait(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
 
        Thread t1 = new Thread(t,"线程1");
        t1.start();
        System.out.println(String.format("%s启动后的状态:%s",t1.getName(),t1.getState()));
        
        Thread t2 = new Thread(t,"线程2");
        t2.start();
        try{
            Thread.sleep(3000);
        }catch(InterruptedException e){
            e.printStackTrace();
        }
        
        System.out.println(String.format("%s启动后的状态:%s",t2.getName(),t2.getState()));
 
    }
}

 执行结果:

 object.wait():

图片

object.wait(3000):

图片

 Block和TimedWaiting:

public class ThreadDemo2{
    
    public static Object object=new Object();
 
    public static void main(String[] args){
        Thread t = new Thread(new Runnable(){
            @Override
            public void run() {
                Thread currThread = Thread.currentThread();
                System.out.println(String.format("%s中同步代码块的状态:%s",currThread.getName(),currThread.getState()));
                
                //synchronized(object){
                  //  try {
                        //waiting状态
                       // object.wait();
                        //time-wait状态
                    //   object.wait(3000);
                    //} catch (InterruptedException e) {
                      //  e.printStackTrace();
                   // }
                //}
                synchronized (object) {
                    try {
                        currThread.sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
 
        Thread t1 = new Thread(t,"线程1");
        t1.start();
        System.out.println(String.format("%s启动后的状态:%s",t1.getName(),t1.getState()));
        
        Thread t2 = new Thread(t,"线程2");
        t2.start();
        //如果没有sleep3秒,状态都会输出runnable
        try{
            Thread.sleep(3000);
        }catch(InterruptedException e){
            e.printStackTrace();
        }
        
        System.out.println(String.format("%s启动后的状态:%s",t2.getName(),t2.getState()));
 
    }
}

 执行结果:以下两种情况都是对的:

图片

不进行sleep操作的情况下输出结果:

图片

以上就是线程的6种状态的相关介绍!

往期精彩回顾