- java的线程是基于操作系统原生的线程模型(非用户态),通过系统调用,将程序的线程交给系统调度执行
- java线程拥有属于自己的虚拟机栈,当JVM将栈、程序计数器、工作内存等准备好后,会分配一个系统原生线程来执行。Java线程结束,原生线程随之被回收
- 原生线程初始化完毕,会调Java线程的run方法。当JAVA线程结束时,则释放原生线程和Java线程的所有资源
- java方法的执行对应虚拟机栈的一个栈帧,用于存储局部变量、操作数栈、动态链接、方法出口等
- New(新建状态):用new关键字创建线程之后,该线程处于新建状态,此时仅由JVM为其分配内存,并初始化其成员变量
- Runnable(就绪状态):当调用Thread.start方法后,该线程处于就绪状态。JVM会为其分配虚拟机栈等,然后等待系统调度
- running(运行状态):处于就绪状态的线程获得CPU,执行run方法时,则线程处于运行状态
- Terminated(线程死亡):线程正常run结束、或抛出一个未捕获的Throwable、调用Thread.stop来结束该线程,都会导致线程的死亡
-
「线程启动函数」
- //Thread.java
- //调用start启动线程,进入Runnable状态,等待系统调度执行
- public synchronized void start(){//synchronized同步执行
- if (threadStatus != 0) //0 代表new状态,非0则抛出错误
- throw new IllegalThreadStateException();
- …
- start0(); //本地方法方法 private native void start0()
- …
- }
- //Running状态,新线程执行的代码方法,可被子类重写
- public void run() {
- if (target != null) {
- //target是Runnable,new Thread(Runnable)时传入
- target.run();
- }
- }
「线程终止函数」
- //Thread.java
- @Deprecated public final void stop();
- //中断线程
- public void interrupt()
- //判断的是当前线程是否处于中断状态
- public static boolean interrupted()
- 用stop会强行终止线程,导致线程所持有的全部锁突然释放(不可控制),而被锁突同步的逻辑遭到破坏。不建议使用
-
interrupt函数中断线程,但它不一定会让线程退出的。它比stop函数优雅,可控制
- 当线程处于调用sleep、wait的阻塞状态时,会抛出InterruptedException,代码内部捕获,然后结束线程
- 线程处于非阻塞状态,则需要程序自己调用interrupted()判断,再决定是否退出