zoukankan      html  css  js  c++  java
  • Java线程的生命周期

    当线程被创建并启动之后,它既不是一启动就进入执行状态,也不是一直处于执行状态,在其生命周期中,要经过"新建(New)"、"就绪(Runnable)"、"运行(Running')"、"阻塞(Blocked)"和"死亡(Dead)"五种状态。线程在创建之后,不可能一直霸占着CPU独立运行,需要在多个线程之间切换,所以大部分时间处于运行、阻塞之间切换。

      一、新建和就绪状态

      (1)、当用new关键字创建一个线程的时候,该线程就处于新建状态;

      (2)、调用start()方法之后,线程就进入了就绪状态。当不能立刻进入运行状态,要等待JVM里线程调度器的调度。

      注意:只能对处于新建状态的线程调用start()方法,否则会引发异常。

      二、运行和阻塞状态

      (1)、如果处于就绪状态的线程获得了CPU,就开始执行run方法,处于了运行状态。当分配的时间用完后,又进入了就绪状态,等待下次分配到CPU在进入运行状态。

      (2)、遇到以下几种情况,线程会进入阻塞状态:

      1)、线程调用sleep()方法主动放弃所占用的处理器资源

      2)、线程调用了一个阻塞式IO方法,在该方法返回之时,该线程被阻塞

      3)、线程试图获得一个同步监视器,但该同步监视器正被其他线程所持有。

      4)、现成在等待某个通知(notify)

      5)、线程调用了线程的suspend()方法将该线程挂起。该方法容易造成死锁,应尽量避免使用该方法。

      进入阻塞状态的程序遇到以下情况才能恢复进入就绪状态,等待分配到资源进入运行状态:

      1)、调用sleep()方法的线程经过了指定时间。

      2)、线程调用的阻塞式IO方法已经返回

      3)、线程成功的获得了试图取得的同步监视器

      4)、线程正在等待的某个通知时,其他线程发出了一个通知(signal)

      5)、处于挂起状态的线程被调用了resume()恢复方法

      三、线程死亡

      (1)、run()或call()方法执行完成,线程正常结束;

      (2)、线程抛出一个未捕获的Exception或Error;

      (3)、直接调用该线程的stop()方法来结束该线程---该方法容易导致死锁,不推荐。

      注意:当主线程结束时,其他线程不收任何影响,并不会随之结束。一旦子线程启动起来后,他就拥有和主线程相同的地位,他不会受主线程的影响。

      为了测试某个线程是否已经死亡,可以调用线程对象的isAlive方法,当线程处于就绪、运行、阻塞3中状态是,该方法返回true;当线程处于新建、死亡2种状态时,该方法将返回false.

      注意:不要试图对一个已经死亡的线程调用start()方法使它重新启动,该线程不可再次作为线程执行。start方法只能对处于新建状态的线程多使用,且只能使用一次!

  • 相关阅读:
    linux常用命令
    mysql 开发基础系列20 事务控制和锁定语句(上)
    sql server 性能调优之 资源等待 CXPACKET
    mysql 开发基础系列19 触发器
    mysql 开发基础系列18 存储过程和函数(下)
    mysql 开发基础系列17 存储过程和函数(上)
    sql server 性能调优之 资源等待PAGEIOLATCH
    mysql 开发基础系列16 视图
    mysql 开发基础系列15 索引的设计和使用
    sql server 性能调优之 当前用户请求分析 (1)
  • 原文地址:https://www.cnblogs.com/wuseyukui/p/3402689.html
Copyright © 2011-2022 走看看