Thread 源码分析

125 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第28天,点击查看活动详情

Thread的特点

  1. 每个Thread都有线程优先级,一般高优先级的线程可能会优先执行

  2. 父线程创建子线程后,子线程的优先级、守护线程属性和父线程是一致的

  3. 退出方法被调用,线程会停止

  4. 所有非守护线程都消亡,或者从运行的方法正常返回,或者运行的方法抛出了异常,线程会停止

  5. 线程都有名字,多个线程可能具有相同的名字,Thread 有的构造器如果没有指定名字,会自动生成一个名字。

线程的状态

  1. NEW:表示线程创建成功,但没有处于运行中,在 new Thread 之后,没有 start 之前,线程的状态都是 NEW
  2. 当运行 strat 方法,线程被创建成功之后,线程的状态变成 RUNNABLE,RUNNABLE 表示线程正在运行中;
  3. 子线程如果运行完成、或被打断、或被中止,状态都会从 RUNNABLE 变成 TERMINATED,TERMINATED 表示线程运行结束;
  4. 如果线程在等待获得 monitor lock 锁,会从 RUNNABLE 变成 BLOCKED,BLOCKED 表示阻塞;
  5. WAITING 和 TIMED_WAITING 类似,都表示在遇到 Object.wait()、Thread.join() 等方法时,线程就会等待另一个线程执行完特定的动作之后,才能结束等待。

线程初始化的方式

  1. 继承 Thread
  2. 实现 Runnable 接口
  3. 实现Callable接口+FutureTask(可以拿到返回结果,可以处理异常)
  4. 线程池创建线程

Java中,类只能支持单继承,当定义一个新的类的时候,如果这个类是自定义的线程类,那继承了Thread就不能再继承其他的类了。如果自定义类必须扩展其他的类,就可以使用实现Runnable接口的方法来定义该类为线程类。

线程常用方法:

  1. join():当前线程(调用此方法的线程)等待另一个线程执行完成之后,才能继续操作
  2. yield():当前线程(调用此方法的线程)放弃当前 cpu的使用权,让 cpu 重新选择线程,线程重新竞争cpu资源的使用
  3. sleep():指定当前线程会睡眠多长时间,但睡眠时不会释放锁