线程的深入分析

151 阅读2分钟

线程Thread

线程状态

枚举定义:enum State{}

状态值含义描述如下

  • NEW: 还未启动线程的状态
  • RUNNABLE: 正在运行的线程,已经在jvm中正在执行,但是可能会在等待操作系统的其他资源,比如cpu
  • BLOCKED: 处于阻塞状态的线程,等待monitor lock去进入一个synchronized代码块或者方法
  • WAITING: 等待线程,下列方法唤醒:wait, join, park。
  • TIMED_WAITING: 线程定时的等待,下列方法触发导致:sleep, wait(long), join(long), parkNanos, parkUtil
  • TERMINATED: 终止线程的状态,已完成。

核心方法

  • yield: 向调度程序提示当前线程愿意让出当前hold的cpu。
  • sleep: 使当前执行的线程进入睡眠状态,以指定的毫秒数为准,线程不会失去任何monitor的所有权
  • start: jvm调用run方法,开启启动线程执行
  • exit: 系统调用exit方法,让线程在退出之前有机会进行清理程序
  • stop: 强制线程停止,检查SecurityManager状态,处理线程状态ThreadDeath
  • interrupt: 线程中断自己
  • destroy: 销毁线程,不需要任何的clean up
  • suspend: 挂起线程,知道resume thread
  • resume: 恢复一个线程
  • join: 等待最多毫秒数的执行,直到线程死亡,join 0,意味着永远等待

ThreadGroup

一个线程组包含一组线程,也能包含多个线程组,形式是一棵树,除了初始线程组,每个都有父母。

在Thread默认创建方法中,该值默认为null。

ThreadLocal

此类提供线程局部变量。他们的对象对应不同的线程,有不同的线程所属变量副本。实例通常是线程私有的。

Thread类中有变量ThreadLocal.ThreadLocalMap threadLocals。

ThreadLocalMap数据结构中,并未使用hashMap数据结构,而是自定义了一个数据结构,除了ThreadLocal并未暴露操作方法,主要是为了帮助解决非常大的引用对象,hash table entries的key主要是使用了弱引用。

Entry extends WeakReference:Entry为弱引用,并且始终为ThreadLocal对象,如果entry.get() == null,则代表不在引用该key,可删除。

弱引用

弱引用,当发生gc时,无关内存是否占满,都会gc掉该引用的对象。但如果发生.get()方法执行,则会由弱引用变成强引用。