Java基础回顾 —线程生命周期

  1. 线程的生命周期:
    一个线程从创建到消亡的过程。

  2. 四种状态:
    创建状态
    可运行状态(就绪状态)
    运行状态
    不可运行状态(堵塞状态)
    消亡状态

  3. 线程状态转换图:

  4. 创建状态:
    当使用new创建一个新的线程对象时,处于创建状态。
    处于创建状态的线程只是 一个空的线程对象,系统不为它分配资源。

  5. 可运行状态(就绪状态):
    执行线程的 start()方法,线程进入线程队列排队,等待CPU为线程分配必须的系统资源,这样就使得该线程处于可运行(Runable)状态。
    这个状态不是运行中状态(Running),因为线程也许实际上并未真正运行。

  6. 运行状态:
    就绪状态的线程被调用,并且获得处理器资源时,线程就进入了运行状态, 并调用线程体的run()方法。如果给定的CPU时间用完或者调用yield()方法,运行状态的线程可能就会进入就绪状态。

  7. 不可运行状态(堵塞状态):
    当发生下列事件时,处于运行状态的线程会转入到不可运行状态。

  1. 调用了sleep()方法;
  2. 线程调用wait()方法等待特定条件的满足;
  3. 线程输入/输出阻塞;
  1. 返回可运行状态:
    处于睡眠状态的线程在指定时间过去后;
    如果线程在等待某一个条件,另一个对象必须通过notify() 或者notifyAll()方法通知等待线程条件的改变;
    如果线程因为输入/输出阻塞,等待输入/输出完成;
  2. 消亡状态:
    线程的run()方法结束之后,该线程自然消亡
  3. 线程调度策略:
    线程调度器选择优先级最高的线程运行,但是特殊情况还是会终止线程的运行。
    线程体中调用了yield()方法,让出了对CPU的占用权。
    线程体中调用了sleep()方法,使线程进入睡眠状态。
    线程由于I/O操作而受阻塞。
    另一个更高于优先级的线程出现。
    在支持时间片的系统中,该线程的时间片用完。
  4. 关于成员变量与局部变量 对于Runnable类型:
    如果一个类继承Thread类,则不适合多个线程共享资源,而实现了Runnable接口,就可以方便的实现资源共享
    如果一个变量是成员变量。那么多个线程对于同一个对象的成员变量进行操作时,他们对该成员变量是彼此影响的( 也就是说一个线程对成员变量的改变会影响另一个线程)。
    如果一个变量是局部变量,那么每个线程都会有一个局部变量的拷贝, 一个线程对该局部变量的改变不会影响到其他线程。
原文地址:https://www.cnblogs.com/nextStep/p/6691292.html