高并发一瞥,线程和线程池的分析

  • java的线程是基于操作系统原生的线程模型(非用户态),通过系统调用,将程序的线程交给系统调度执行
  • java线程拥有属于自己的虚拟机栈,当JVM将栈、程序计数器、工作内存等准备好后,会分配一个系统原生线程来执行。Java线程结束,原生线程随之被回收
  • 原生线程初始化完毕,会调Java线程的run方法。当JAVA线程结束时,则释放原生线程和Java线程的所有资源
  • java方法的执行对应虚拟机栈的一个栈帧,用于存储局部变量、操作数栈、动态链接、方法出口等
  • New(新建状态):用new关键字创建线程之后,该线程处于新建状态,此时仅由JVM为其分配内存,并初始化其成员变量
  • Runnable(就绪状态):当调用Thread.start方法后,该线程处于就绪状态。JVM会为其分配虚拟机栈等,然后等待系统调度
  • running(运行状态):处于就绪状态的线程获得CPU,执行run方法时,则线程处于运行状态
  • Terminated(线程死亡):线程正常run结束、或抛出一个未捕获的Throwable、调用Thread.stop来结束该线程,都会导致线程的死亡
  • 「线程启动函数」

    
    
    1. //Thread.java 
    2. //调用start启动线程,进入Runnable状态,等待系统调度执行 
    3. public synchronized void start(){//synchronized同步执行 
    4.     if (threadStatus != 0) //0 代表new状态,非0则抛出错误 
    5.             throw new IllegalThreadStateException(); 
    6.     … 
    7.     start0(); //本地方法方法 private native void start0() 
    8.     … 
    9. //Running状态,新线程执行的代码方法,可被子类重写 
    10. public void run() { 
    11.     if (target != null) { 
    12.         //target是Runnable,new Thread(Runnable)时传入 
    13.         target.run();  
    14.     } 

    「线程终止函数」

    
    
    1. //Thread.java 
    2. @Deprecated public final void stop(); 
    3. //中断线程 
    4. public void interrupt() 
    5. //判断的是当前线程是否处于中断状态 
    6. public static boolean interrupted() 
    • 用stop会强行终止线程,导致线程所持有的全部锁突然释放(不可控制),而被锁突同步的逻辑遭到破坏。不建议使用
    • interrupt函数中断线程,但它不一定会让线程退出的。它比stop函数优雅,可控制

      • 当线程处于调用sleep、wait的阻塞状态时,会抛出InterruptedException,代码内部捕获,然后结束线程
      • 线程处于非阻塞状态,则需要程序自己调用interrupted()判断,再决定是否退出

【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章