Java多线程

线程的生命周期分为:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)、死亡(Dead)五个阶段。

线程启动后,随着CPU的调度,线程会在运行和阻塞两种状态间切换。

新建:使用new关键字创建一个线程后,线程就处于新建状态;

就绪:线程对象调用start方法后,线程处于就绪状态。此时线程能否运行取决于jvm线程调度器的调度;

运行:线程获得CPU后,进入运行状态;

阻塞:未死亡的线程失去CPU后进入阻塞状态;

死亡:线程run()方法执行完成;线程抛出未被捕获的Exception或Error;线程主动调用stop()方法结束当前线程。

线程从运行进入阻塞的情况:

  1. 线程调用sleep()方法,主动放弃所占用的处理器资源;
  2. 线程调用了一个阻塞式IO方法,在该方法返回之前,线程被阻塞;
  3. 线程试图获取一个同步监视器,但该同步监视器正被其他线程所持有;
  4. 线程在等待某个通知(notify);
  5. 程序调用了线程的suspend方法将线程挂起

线程从阻塞进入就绪状态:

  1. 调用sleep()方法的线程已经过了指定的时间;
  2. 线程调用的阻塞式IO方法已经返回;
  3. 线程成功获取了同步监视器;
  4. 线程接收到了通知;
  5. 处于挂起状态的线程被调用了resume()方法

线程状态转换图:

image

关于线程死亡:

  1. 主线程运行结束后,其他线程并不会随之结束。一旦子线程启动后就会拥有和主线程相同的地位。
  2. 可以使用isAlive()判断线程是否死亡,处于就绪、运行、阻塞状态下的线程isAlive()返回true,处于新建、死亡状态下的线程isAlive()返回false。
  3. 对已死亡的线程不可以使用start()使之重新启动。只能对新建的线程调用start()方法,但也只能调用一次。
原文地址:https://www.cnblogs.com/amunote/p/4100745.html