线程的状态解析

2020-11-23 20:45发布

线程状态


一、线程的6中状态

6个状态定义:java.lang.Thread.State

1、New:

  尚未启动的线程的线程状态

2、Runnable:

可运行线程的线程状态,等待CPU调度。

3、Blocked:

线程阻塞等待监视器锁定的线程状态。

处于synchronized同步代码块或方法中被阻塞

4、Waiting:

等待线程的线程状态。下列不带超时的方式:

Object.wait、Thread.join、LockSupport.park

5、Timed Waiting:

具有指定等待时间的等待线程的线程状态。下列带超时的方式:

 Thread.sleep、Object.wait、Thread.join、LockSupport.parkNanos、LockSupport.parkUntil

6、Teminated:

终止线程的线程状态。线程正常完成执行或者出现异常


二、线程状态示意图

三、线程状态演示

1、第一种状态切换 --新建->运行->终止

System.out.println("######第一种状态切换 --新建->运行->终止#######");
      Thread thread1= new Thread(new Runnable() {
           @Override
           public void run() {
               System.out.println("thread1当前状态:"+Thread.currentThread().getState().toString());
               System.out.println("thread1执行了");
           }
       });

System.out.println("没调用start方法,thread1当前状态:"+thread1.getState().toString());

thread1.start();
//等待thread1执行结束,在看状态
Thread.sleep(2000L);

System.out.println("等待2秒,在看thread1当前状态:"+thread1.getState().toString());

System.out.println();

2、第二种状态切换:新建-->运行->等待->运行->终止(sleep方式)

System.out.println("#######第二种状态切换:新建-->运行->等待->运行->终止(sleep方式)########");

Thread thread2=new Thread(new Runnable() {
           @Override
           public void run() {
               //让线程2,等待1500毫秒
               try {
                   Thread.sleep(1500);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
               //获取线程状态
               System.out.println("thread2当前状态:"+Thread.currentThread().getState().toString());
               System.out.println("thread2执行了");
           }
       });
System.out.println("没调用start方法,thread2当前状态:"+thread2.getState().toString());

thread2.start();
System.out.println("调用start方法,thread2当前状态:"+thread2.getState().toString());
//等待200毫秒,在看状态
Thread.sleep(200);
System.out.println("等待200毫秒,在看thread2当前状态:"+thread2.getState().toString());

//等待3秒,让thread2执行完毕,在看状态
Thread.sleep(3000);
System.out.println("等待3秒,在看Thread2当前状态:"+thread2.getState().toString());

System.out.println();

3、第三种:新建->运行->阻塞->运行->终止

System.out.println("########第三种:新建->运行->阻塞->运行->终止#############");
Thread thread3=new Thread(new Runnable() {
           @Override
           public void run() {
               synchronized (Demo2.class){
                   System.out.println("thread3当前状态:"+Thread.currentThread().getState().toString());
                   System.out.println("thread3执行了");
               }
           }
       });
synchronized (Demo2.class){
  System.out.println("没调用start方法,thread3当前状态:"+thread3.getState().toString());
           thread3.start();
 System.out.println("调用start方法,thread3当前状态:"+thread3.getState().toString());
  //等待200毫秒
 Thread.sleep(200);
 System.out.println("等待200毫秒,在看thread3当前状态:"+thread3.getState().toString());
       }
//在等待3秒,让thread2抢到锁,在看thread3状态
Thread.sleep(3000);
System.out.println("待3秒,让thread3抢到锁,在看thread3状态:"+thread3.getState().toString());