java多线程的生命周期,线程的生命周期要经历哪些状态

  java多线程的生命周期,线程的生命周期要经历哪些状态

  面试的时候有没有被问到这个问题“谈谈Java中线程的生命周期状态!”

  这几乎是一个面试必答题。这个问题怎么回答才是最好的答案?本文带你破解!(文末有免费的技术书籍~)

  一个图表说明了线程的生命周期。JVM源代码将线程生命周期分为六种状态:新建、可运行、阻塞、等待、Timed_Waiting和终止。

  在系统运行的过程中,不断有新的线程被创建,旧的线程在执行后被清理,线程在排队共享资源或锁时会被阻塞,所以运行中的线程会在可运行、阻塞和等待状态中来回切换。

  线程的具体状态转换过程如图所示。

  线程生命周期状态转换过程

  (1)调用new方法创建一个新线程,线程处于新创建的状态。

  (2)调用start方法启动一个线程,然后线程处于可运行状态。操作状态可以分为两种状态:就绪和运行。就绪状态的线程等待线程获取CPU资源,等待其获取CPU资源后,线程会执行run方法进入运行状态;当正在运行的线程调用yield方法或失去处理器资源时,它将再次进入就绪状态。

  (3)执行sleep方法、I/O阻塞、等待同步锁、等待通知、调用suspend方法后,运行线程会挂起,进入阻塞状态。被阻塞的线程会在runnable状态下再次进入ready状态,等待CPU时间片的轮询,由于休眠时间到了,I/O方法返回,获得同步锁,收到通知,调用resume方法。线程在获取CPU资源后会再次进入运行状态。

  (4)当线程调用Object.wait(),Object.join()和LockSupport.park()时,线程进入等待状态。等待线程在调用Object.notify()对象后将再次进入runnable状态。notifyAll()和LockSupport.unpark(Thread)方法。

  (5)当可运行线程调用Thread.sleep(long)、Object.wait(long)、Thread.join(long)、LockSupport.parkNanos()、LockSupport.parkUntil()时,线程将进入超时等待状态。当等待超时的线程到期时,等待进入synchronized方法,等待进入synchronized块,或者调用Object.notify(),Object。notifyAll(),LockSupport.unpark(Thread),它将再次进入可运行状态。

  (runnable状态的线程在run方法或call方法的正常执行完成,调用stop方法停止线程,或者程序执行错误导致异常退出时,会进入终止状态。

  线程生命周期的新状态(New)使用new关键字在Java中创建一个线程,新创建的线程将处于新状态。创建线程时,主要是为线程分配内存,并初始化其成员变量的值。

  就绪状态:Runnable新创建的线程对象在调用start方法后会变为可运行。运行状态可以分为就绪和运行两种状态。就绪状态意味着JVM已经完成了方法调用栈和程序计数器的创建,等待线程被调度和运行。

  当就绪线程争夺CPU使用权,开始执行run方法的线程执行体时,就会转入运行状态。运行线程的主要任务是执行run方法中的逻辑代码。

  被阻塞的运行线程会主动或被动地放弃使用CPU的权利,暂停运行。这个时候线程就会变成阻塞,直到再次进入runnable状态才能再次竞争CPU的使用权。有三种阻塞状态。

  (1)等待阻塞:当正在运行的线程调用o.wait方法时,JVM会将该线程放入waiting队列,该线程将被阻塞。

  (2)同步阻塞:当一个正在运行的线程试图获取一个被其他线程占用的对象的同步锁时,JVM会将该线程放入锁池中,此时该线程将被阻塞。

  (3)其他阻塞:当一个正在运行的线程执行Thread.sleep(long ms)、Thread.join()或者发出I/O请求时,JVM会将线程转为阻塞状态。直到sleep()状态超时,Thread.join()等待线程终止或超时,或者I/O处理完成,线程再次进入可运行状态。

  等待状态:等待当线程调用Object.wait()、Thread.join()和LockSupport.park()时,会进入等待状态。等待线程正在等待另一个线程执行指定的操作。例如,调用Object.wait()的线程对象正在等待另一个线程调用其Object.notify()或Object.notifyAll()。调用线程的线程。join()正在等待指定的线程退出。

  超时状态:Timed_Waiting超时等待和等待状态的区别在于,处于超时等待状态的线程会在超时后自动唤醒。当线程调用Thread.sleep()、Object.wait(long)、Thread.join(long)、LockSupport.parkNanos()、LockSupport.parkUntil()时,线程会进入超时等待状态。

  终止线程:被终止的线程在以下列三种方式结束后变成终止。

   * *线程正常结束:**run方法或call方法完成。

   * *线程异常退出:* *正在运行的线程抛出错误或未捕获的异常,线程异常退出。

   * *手动结束:* *调用线程对象的stop方法手动结束正在运行的线程(这种方法会瞬间释放线程所占用的同步对象的锁,导致锁混乱和死锁,不推荐)。

  版权归作者所有:原创作品来自博主小二上九8,转载请联系作者取得转载授权,否则将追究法律责任。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: