线程中的几种状态你知道吗?

    作者:课课家教育更新于: 2016-09-19 18:02:55

    大神带你学编程,欢迎选课

      在计算机中执行一个应用程序是一个进程,而线程是进程内部的、执行过程中产生的多条执行线索,是比进程单位还要小的一个执行单位。而每个进程中可以有若干个线程,多个线程之间又可以共享数据空间。而进行的中又分为几种状态,本文将会对线程的几种状态进行了解。

    Java图标图片

      线程的状态

      在线程中有5中状态,分别是:1)新建状态 2)可运行状态(就绪状态) 3)运行状态 4)阻塞状态 5)死亡状态

      新建状态

      使用new 语句(Thread t = new Thread(new Runner())创建的线程是处于新建状态的,这个时候的线程就像是一个java 对象一样,只是在Heap 中分配了内存,并不能称之为一个独立的线程,还需要等待启动(start()方法),才成成为独立的线程。当一个线程处于新建状态的时候,他就仅仅是一个空的线程对象,系统并不会为其分配资源。

      就绪状态

      当线程调用了start () 方法只会,该线程就会变为可运行状态,处于线程的 run () 中,系统会为这个线程分配它运行时所需的所有资源(除了处理器之外)。这时候线程处于随时可以运行的状态,并且在随后的任意时间内,只要线程获得处理器就会进入运行状态。

    线程中各种状态的转换

    线程中各种状态的转换图

      运行状态

      这个状态下的线程是占用CPU的并且执行程序代码段。这里说一下单CPU和多CPU的差别,在并发环境中,如果计算机中有多个CPU,就在同一时刻让几个线程占用不同的CPU并且使得它们都处于运行状态。而如果计算机中只有一个CPU,那么任何时刻下都只会有一个线程处于运行状态。

      注意,只有就绪状态下的线程才能转到运行状态。

      阻塞状态

      一个正在执行的线程因为一些特殊的原因被暂时暂停执行,这时候就会进入阻塞状态。当线程处于阻塞状态的时候,直到线程重新进入就绪状态之前Java 虚拟机都不会将CPU分配给线程。

      引起阻塞状态的原因又很多,一般有这3中情况:

        1)调用方法sleep() 使线程进入睡眠状态或者调用了其他线程中的join() 方法,又或者发出了I/O 请求。例如:当一个线程执行System.out.println()或者System.in.read()方法时是,就会发出一个I/O请求,该线程放弃CPU,进入阻塞状态,直到I/O处理完毕,该线程才会恢复执行

        2)位于等待池中的阻塞状态:当线程在运行状态的时候执行了某个对象中的wait()方法,这时候Java 虚拟机就会将线程放到这个对象的等待池中。

        3)位于对象锁池中的阻塞状态:在线程处于运行状态的时候试图去获取某个对象的同步锁,如果此时该对象的同步锁已经被占用,Java 虚拟机就会将这个线程放到这个对象的锁池当中。简单的说就是线程在等待锁,当前锁被别的线程持有。

      当线程处于阻塞状态的时候,只有等到它需要的条件满足之后才能继续进入就绪状态。

      死亡状态

      线程死亡的原因可以是:线程退出run () 方法的时候就会进入死亡状态并且这个线程的生命周期结束;另一个就是线程处于“可运行”状态的时候调用了stop () 方法结束了线程的运行;线程一般情况下是正常执行完run() 方法而退出的,但是也可能遇到异常导致退出。但是不管线程是正常还是非正常结束,都不会对其他的线程造成影响。

         以上就是对于线程中的5种状态简单了解,最后简单的讲一下,每一个Java 程序都会有一个默认的主程序。线程没有入口也没有出口,所以它自己不能自动的运行,它需要栖身与某一个进程之中,并由进程触发执行。希望本文能对有需要的朋友有所帮助,如果希望学习编程以及计算机的技术,可以在本网站中进行搜索或者直接点击文中所感兴趣的链接。

课课家教育

未登录

1