JUC知识点总结(五)线程的生命周期

10.线程的生命周期

在这里插入图片描述

  • 新建,当程序使用new关键字创建了一个线程之后,该线程就处于新建状态,此时仅由JVM为其分配内存,并初始化其成员变量的值;
  • 就绪,当线程对象调用了start()方法之后,该线程处于就绪状态。Java虚拟机会为其创建方法调用栈和程序计数器,等待调度运行;
  • 运行,如果处于就绪状态的线程获得了CPU,开始执行run()方法的线程执行体,则该线程处于运行状态;
  • 阻塞,在运行状态的时候,可能因为某些原因导致运行状态的线程变成了阻塞状态,比如sleep()、wait()之后线程就处于了阻塞状态,这个时候需要其他机制将处于阻塞状态的线程唤醒,比如调用notify或者notifyAll()方法。唤醒的线程不会立刻执行run方法,它们要再次等待CPU分配资源进入运行状态;
  • 销毁:如果线程正常执行完毕后或线程被提前强制性的终止或出现异常导致结束,那么线程就要被销毁,释放资源。

JAVA中线程的生命周期:

  • NEW(初始化状态)
  • READY(可运行 / 运行状态)
  • BLOCKED(阻塞状态)
  • WAITING(无时限等待)
  • TIMED_WAITING(有时限等待)
  • TERMINATED(终止状态)

线程状态的转换

  • RUNNABLE 与 BLOCKED 的状态转换: 只有一种方法,线程获取/等待 synchronized 的隐式锁

  • RUNNABLE 与 WAITING/TIMED_WAITING 的状态转换:

    • wait/notify/notifyAll
    • join
    • sleep
    • LockSupport.park() Java 并发包中的锁,都是基于LockSupport 对象实现的
  • 从 RUNNABLE 到 TERMINATED 状态:

    • interrupt() (通知线程,线程有机会执行一些后续操作,同时也可以无视这个通知)stop() (立即杀死线程,若未释放锁会造成死锁,弃用)
    • 执行完成
    • 异常中断

初始化线程:当前线程就是将要启动线程的父线程;父线程为子线程进行空间分配,子线程继承了父线程的isDaemon(守护线程: 如果程序中所有的用户线程都退出了,那么所有的守护线程就都会被杀死 )、优先级、contextClassLoader、和可继承的线程池并分配一个唯一的ID标识该线程。

启动线程:调用start()方法就可以启动这个线程。线程start()方法的含义是:当前线程(即parent线程)同步告知Java虚拟机,只要线程规划器空闲,应立即启动调用start()方法的线程。

中断:在Java中,停止一个线程的主要机制是中断,中断并不是强迫终止一个线程,它是一种协作机制,是给线程传递一个取消信号,但是由线程来决定如何以及何时退出。Thread.interrupt() 的作用其实也不是中断线程,而是 通知线程应该中断了。

public boolean isInterrupted();//测试此线程是否已被中断。此方法不影响线程的中断状态

public void interrupt();//中断线程

public static boolean interrupted();//测试此线程是否已被中断,并清空中断标志位

等待/通知机制 wait()/notify(),notifyAll(),condition

join():一种同步机制,A线程调用B线程.join(),A线程会等待B线程执行完再执行。join在start之前调用没有意义。

下一篇
JUC知识点总结(五)生产者消费者模式的三种常见实现方法

发布了54 篇原创文章 · 获赞 11 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/dong_W_/article/details/105017144