线程的生命周期和线程的状态转换图

一、线程的生命周期

  1、线程的5种状态:新建(New),就绪(Runnable),运行(Running),阻塞(Blocked),死亡(Dead)

  2、线程的生命周期图解:(参考传智播客刘意2015Java基础视频讲义)

二、线程的状态转换图

  1、线程的5种状态:新建(New),就绪(Runnable),运行(Running),阻塞(Blocked),死亡(Dead)

    线程变化的状态转换图例如以下:

      1)新建状态(New):新创建了一个线程对象。

      2)就绪状态(Runnable):线程对象创建后,其它线程调用了该对象的start()方法。该状态的线程位于可执行线程池中,变得可执行,等待获取CPU的使用权。

      3)执行状态(Running):就绪状态的线程获取了CPU。执行程序代码。

      4)堵塞状态(Blocked):堵塞状态是线程由于某种原因放弃CPU使用权。临时停止执行。直到线程进入就绪状态,才有机会转到执行状态。

        堵塞的情况分三种:

          (一)等待堵塞:执行的线程执行wait()方法,JVM会把该线程放入等待池中。

          (二)同步堵塞:执行的线程在获取对象的同步锁时,若该同步锁被别的线程占用。则JVM会把该线程放入锁池中。

          (三)其它堵塞:执行的线程执行sleep()或join()方法,或者发出了I/O请求时。JVM会把该线程置为堵塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完成时。线程又一次转入就绪状态。

      5)死亡状态(Dead):线程运行完了或者因异常退出了run()方法,该线程结束生命周期。

  2、线程的状态转换图(参考传智播客刘意2015Java基础视频讲义)

  3、解释(参考 https://www.cnblogs.com/bhlsheji/p/5099362.html)

    1)线程的实现有两种方式,一是继承Thread类,二是实现Runnable接口,但无论如何,当我们new了这个对象后。线程就进入了初始状态;

    2)当该对象调用了start()方法,就进入可执行状态;

    3)进入可执行状态后,当该对象被操作系统选中。获得CPU时间片就会进入执行状态;

    4)进入执行状态后情况就比较复杂了

      (1)run()方法或main()方法结束后,线程就进入终止状态;

      (2)当线程调用了自身的sleep()方法或其它线程的join()方法,就会进入堵塞状态(该状态既停止当前线程,但并不释放所占有的资源)。当sleep()结束或join()结束后。该线程进入可执行状态,继续等待OS分配时间片;

      (3)线程调用了yield()方法,意思是放弃当前获得的CPU时间片,回到可执行状态,这时与其它进程处于同等竞争状态,OS有可能会接着又让这个进程进入执行状态;

      (4)当线程刚进入可执行状态(注意,还没执行),发现将要调用的资源被synchroniza(同步),获取不到锁标记。将会马上进入锁池状态,等待获取锁标记(这时的锁池里或许已经有了其它线程在等待获取锁标记,这时它们处于队列状态,既先到先得),一旦线程获得锁标记后,就转入可执行状态。等待OS分配CPU时间片;

      (5)当线程调用wait()方法后会进入等待队列(进入这个状态会释放所占有的全部资源,与堵塞状态不同)。进入这个状态后。是不能自己主动唤醒的,必须依靠其它线程调用notify()或notifyAll()方法才干被唤醒(因为notify()仅仅是唤醒一个线程,但我们由不能确定详细唤醒的是哪一个线程。或许我们须要唤醒的线程不可以被唤醒,因此在实际使用时,一般都用notifyAll()方法,唤醒有所线程),线程被唤醒后会进入锁池。等待获取锁标记。

原文地址:https://www.cnblogs.com/xy-ouyang/p/10461393.html

时间: 2024-11-06 03:45:08

线程的生命周期和线程的状态转换图的相关文章

线程的生命周期与线程状态

一.如果希望明确地让一个线程给另外一个线程运行的机会,可以采取以下办法之一. 调整各个线程的优先级 让处于运行状态的线程调用Thread.sleep()方法 让处于运行状态的线程调用Thread.yield()方法 让处于运行状态的线程调用另一个线程的join()方法 二. 一个线程会因为以下原因而放弃CPU. 1 java虚拟机让当前线程暂时放弃CPU,转到就绪状态,使其它线程或者运行机会. 2 当前线程因为某些原因而进入阻塞状态 3 线程结束运行 三. 线程状态 NEW是至今尚未启动的线程的

线程的生命周期,线程结束

一个新的线程通过start()进入运行状态,在运行状态中可以进行yield()方法进行礼让,但是仍然可以进行,如果现在现场需要暂停的话,可以使用suspend(), sleep(),wait()方法.如果线程不要执行,通过通过stop()结束(如果run()方法执行完毕也表示结束),或者一个新的线程直接调用stop()也可以进行结束. suspend():挂起. resume():恢复挂起状态. stop():停止进程. 以上方法容易产生死锁,不建议使用. 如果现在要停止一个线程,该如何做? 通

java_5:线程的生命周期和状态转换

一.线程5个状态的简单介绍 开始:当线程Thread对象创建完成时,线程的生命周期就开始了结束:当run()方法中代码正常执行完毕或者线程抛出一个未捕获的异常(Exception)或错误(Error)时,线程的生命周期结束 线程整个生命周期分为5个阶段: 新建状态(New):此时仅由Java虚拟机为其分配了内存,没有表现出任何线程的动态特征,还不能运行 就绪/可运行状态(Runnable):线程对象调用了start()方法,具备了运行条件,此时线程位于可运行池中.但能否运行,要看是否获得CPU使

Java线程的生命周期(转)

Java线程的生命周期 一个线程的产生是从我们调用了start方法开始进入Runnable状态,即可以被调度运行状态,并没有真正开始运行,调度器可以将CPU分配给它,使线程进入Running状态,真正运行其中的程序代码.线程在运行过程中,有以下几个可能的去向: (1)调度器在某个线程的执行过程中将CPU分配给了其它线程,则这个线程又变为Runnable状态,等待被调度. (2)调度器将CPU分配给了该线程,执行过程中没有遇到任何阻隔,运行完成直接结束,也就是run()方法执行完毕. (3)线程在

分享Java线程的生命周期

Java线程的生命周期 一个线程的产生是从我们调用了start方法开始进入Runnable状态,即可以被调度运行状态,并没有真正开始运行,调度器可以将CPU分配给它,使线程进入Running状态,真正运行其中的程序代码.线程在运行过程中,有以下几个可能的去向: (1)调度器在某个线程的执行过程中将CPU分配给了其它线程,则这个线程又变为Runnable状态,等待被调度. (2)调度器将CPU分配给了该线程,执行过程中没有遇到任何阻隔,运行完成直接结束,也就是run()方法执行完毕. (3)线程在

Java并发编程:线程的生命周期是个怎样的过程?

前言 在日常开发过程中,如果我们需要执行一些比较耗时的程序的话,一般来说都是开启一个新线程,把耗时的代码放在线程里,然后开启线程执行.但线程是会耗费系统资源的,如果有多个线程同时运行,互相之间抢占系统资源,那无疑会对系统造成极大的压力.所以,怎么操作线程,保证不影响整个应用功能是很重要的,而这就需要我们了解线程的生命周期了. 线程的生命周期 线程的生命周期有6种状态,分别是NEW(新建).RUNNABLE(可运行).BLOCKED(被阻塞). WAITING(等待).TIMED_WAITING(

线程的生命周期和控制

一.线程的生命周期 进程与线程一样,都具有一定的生命周期,线程的生命周期包括四个状态:创建状态.就绪状态.阻塞状态.死亡状态. 1.创建状态 1)是指使用new实例化一个线程对象,但该线程对象还未使用start()方法启动线程这个阶段,该阶段只在内存的堆中为该对象的实例变量分配了内存空间,但线程还无法参与抢夺CPU的使用权: 2)创建完毕线程对象后,启动该线程对象的是start()方法,而不是run()方法. 2.就绪状态 1)是指一个线程对象使用start()方法后到运行完run()方法的这个

Java多线程 2 线程的生命周期和状态控制

一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态(runnable). 注意:不能对已经启动的线程再次调用start()方法,否则会出现Java.lang.IllegalThreadStateException异常. 2.就绪状态 处于就绪状态的线程已经具备了运行条件,但还没有分配到CPU,处于线程就绪队列(尽管是采用队列形式,事实上,把它

Java中的线程的生命周期大体可分为5种状态

Java中的线程的生命周期大体可分为5种状态. ①NEW:这种情况指的是,通过New关键字创建了Thread类(或其子类)的对象 ②RUNNABLE:这种情况指的是Thread类的对象调用了start()方法,这时的线程就等待时间片轮转到自己这,以便获得CPU:第二种情况是线程在处于RUNNABLE状态时并没有运行完自己的run方法,时间片用完之后回到RUNNABLE状态:还有种情况就是处于BLOCKED状态的线程结束了当前的BLOCKED状态之后重新回到RUNNABLE状态. ③RUNNING