线程的六种状态

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

前言


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


b078f096ceab4fa39f990044158263e2~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


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


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());
    }
}
复制代码


执行结果:


微信截图_20220518082524.png


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():


微信截图_20220518082544.png


object.wait(3000):


微信截图_20220518082557.png


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()));
    }
}
复制代码


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


188b0b06ca22474d9f50222559989563~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


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


微信截图_20220518082616.png


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

目录
相关文章
|
5月前
|
Java
线程的六种状态
线程的六种状态
|
5月前
|
存储 资源调度 Java
详解Java线程的几种状态
详解Java线程的几种状态
47 0
|
3月前
|
Java 调度
Java线程的六种状态
Java线程有六种状态: 初始(NEW)、运行(RUNNABLE)、阻塞(BLOCKED)、等待(WAITING)、超时等待(TIMED_WAITING)、终止(TERMINATED)。
55 1
|
2月前
|
安全 Java 调度
线程的状态和生命周期
在多线程编程中,线程的状态和生命周期是两个非常重要的概念。了解线程的状态和生命周期可以帮助我们更好地理解和编写多线程程序。
47 4
|
5月前
|
Java
线程的666种状态
线程的666种状态
21 1
|
5月前
|
Java 调度
|
10月前
|
调度
【多线程】线程的状态
【多线程】线程的状态
|
Java
Java线程状态
Java线程状态
50 0
|
Java
Java线程的几种状态
Java线程的几种状态
47 0