多线程的几种状态

Posted 哔卟哔卟_: )

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程的几种状态相关的知识,希望对你有一定的参考价值。

Java-多线程的几种状态

多线程的状态

  • NEW( 系统中线程还未创建,只是有个Thread对象)
  • RUNNABLE(就绪状态. 又可以分成正在工作中和即将开始工作)
  • TERMINATED(系统中的线程已经执行完了,Thread对象还在)
  • TIMED_WAITING(指定时间等待,调用Thread.sleep()方法)
  • BLOCKED(线程阻塞状态)
  • WAITING(使用wait方法出现的状态)

🔎1.NEW( 系统中线程还未创建,只是有个Thread对象)

public class Test 
    public static void main(String[] args) 
        Thread t = new Thread(() -> 

        );
		
		//线程启动之前获取线程状态 --> 只是有个Thread对象
        System.out.println(t.getState());

        t.start();
    


🔎2.RUNNABLE( (就绪状态. 又可以分成正在工作中和即将开始工作)

public class Test 
    public static void main(String[] args) 
        Thread t = new Thread(() -> 
            while(true) 
                try 
                    Thread.sleep(500);
                 catch (InterruptedException e) 
                    e.printStackTrace();
                

            

        );

        t.start();
        //线程就绪状态
        System.out.println(t.getState());
    


🔎3.TERMINATED(系统中的线程已经执行完了,Thread对象还在)

public class Test 
    public static void main(String[] args) 
        Thread t = new Thread(() -> 
            
        );

        t.start();

        try 
            Thread.sleep(500);
         catch (InterruptedException e) 
            e.printStackTrace();
        
        //线程TERMINATED状态
        System.out.println(t.getState());
    


🔎4.TIMED_WAITING(指定时间等待,调用Thread.sleep()方法)

public class Test 
    public static void main(String[] args) 
        Thread t = new Thread(() -> 
            while(true) 
                try 
                    Thread.sleep(500);
                 catch (InterruptedException e) 
                    e.printStackTrace();
                
            
        );

        t.start();

        try 
            Thread.sleep(3000);
         catch (InterruptedException e) 
            e.printStackTrace();
        
        //线程TIMED_WAITING状态
        System.out.println(t.getState());
    


🔎5.BLOCKED(线程阻塞状态)

阻塞状态值得是代码不继续执行,而在等待
阻塞结束后,线程重新进入就绪状态
影响阻塞的方法

  • sleep()
  • wait()
  • join()
  • yield()

🔎6.WAITING(使用wait方法出现的状态)

线程调用 wait() 方法之后,就会变为 WAITING状态


🔎结尾

如果大家有什么不太理解的,可以私信或者评论区留言,一起加油

java多线程的几种状态

java线程状态在Thread中定义,源码中能看到有个枚举State,总共定义了六种状态:

NEW: 新建状态,线程对象已经创建,但尚未启动

RUNNABLE:就绪状态,可运行状态,调用了线程的start方法,已经在java虚拟机中执行,等待获取操作系统资源如CPU,操作系统调度运行。

BLOCKED:堵塞状态。线程等待锁的状态,等待获取锁进入同步块/方法或调用wait后重新进入需要竞争锁

WAITING:等待状态。等待另一个线程以执行特定的操作。调用以下方法进入等待状态。 Object.wait(), Thread.join(),LockSupport.park

TIMED_WAITING: 线程等待一段时间。调用带参数的Thread.sleep, objct.wait,Thread.join,LockSupport.parkNanos,LockSupport.parkUntil

TERMINATED:进程结束状态。

状态之间的转换状态图,总结了下,如下:

技术图片

其中,Thread.sleep(long)使线程暂停一段时间,进入TIMED_WAITING时间,并不会释放锁,在设定时间到或被interrupt后抛出InterruptedException后进入RUNNABLE状态; Thread.join是等待调用join方法的线程执行一段时间(join(long))或结束后再往后执行,被interrupt后也会抛出异常,join内部也是wait方式实现的。

wait方法是object的方法,线程释放锁,进入WAITING或TIMED_WAITING状态。等待时间到了或被notify/notifyall唤醒后,回去竞争锁,如果获得锁,进入RUNNABLE,否则进步BLOCKED状态等待获取锁。

下面是一个小例子,主线程中调用多线程,等待超时后如果子线程还未结束,则中断子线程(interrupt)。

技术图片
技术图片
 
转载:https://baijiahao.baidu.com/s?id=1574105592023615&wfr=spider&for=pc

以上是关于多线程的几种状态的主要内容,如果未能解决你的问题,请参考以下文章

多线程的几种状态

多线程杂记

java 线程的几种状态

Java线程的几种状态

Java-JUC:同步锁的几种方式

JAVA 线程的几种状态