Java并发基础(1)------Thread

建立Thread的方法:

  • 经过继承Thread类
  • 实现runnable接口
  • 使用线程池
  • 实现callable接口(call方法能够有返回值,能够抛出异常)

实现线程的经常使用的方法有以上几种,在选择实现线程的方法要注意如下几点:java

  1. 若是要extend其余类的时候,建议使用除继承Thread类外方法,由于java不支持多继承
  2. 若是须要有返回值,能够实现callable接口
  3. 使用线程池建立线程能够避免因频繁的建立和销毁线程损耗系统的性能

Thread的生命周期

(1)生命周期设计模式

NEW (新建)函数

RUNNABLE(可运行)源码分析

RUNNING (运行)性能

BLOCKED (阻塞)线程

TERMINATED(中断)设计

(2)转化过程图示:3d

(3)注意点:cdn

  • 使用 new 建立一个Thread 对象中,此时它并不处在执行状态,在没有执行Thread.start()方法前,只是一个普通的Thread对象,经过start进入RUNNABLE状态,这时候才会真正在JVM中建立了一个线程。对象

  • 线程对象进入RUNNABLE必须调用start,可是线程的运行与否,同样须要放任与CPU的调度。进入RUNNABLE状态后,线程只能意外终止或者进入RUNNING状态。

  • 线程对象进入RUNNING后,可能会有如下的可能

  • 线程对象进入BLOCKED后,可能会如下状态

  • 线程对象进入TERMINATED后,也会有几种状况(这是线程的最终状态了,线程不会切换到其余任何状态):

Thread经常使用方法

(1)sleep() 和 yield()区别

  • sleep会致使当前线程暂停指定的时间,没有CPU时间片的消耗
  • yield只是对CPU调度器的一个提示,若是CPU没有忽略这个提示,它会致使线程上下文的切换。
  • sleep会使线程短暂的block,会在给定的时间内释放CPU资源
  • yield会使running状态的Thread进入runnable状态
  • sleep机会百分百的完成了给定时间的休眠,而yield的提示并不能必定担保
  • 调用interruptsleep能够捕获到,而yield不会

(2)interrupt:线程的flag将会被设置,打断正在运行的状态。

(3)isInterrupted:线程状态的判断

(4)interrupted:是一个静态方法,会将当前的线程的状态设置为false,返回当前状态,第一次返回true,一直调用都只会返回false

Thread的源码分析

构造方法

阅读源码总结

  1. 线程的默认命名:线程会以"Thread-"做为一个自增数字为组合。

  2. 新建立的任何一个线程都会有一个父线程

    • 一个线程的建立必定是由另一个线程完成的
    • 被建立的线程的父线程必定是建立他的线程,main函数所在的线程是有JVM建立的,即main线程,而main线程的父线程为System。
  3. 新建的线程若是没有显示指定线程组,则他会加入到父线程的线程组中。

  4. start()分析:模板设计模式:线程真正的逻辑实如今run方法中,咱们须要经过重写Runnable接口对其进行构造,run方法是一个空的实现

  1. Thread对象建立后处于NEW状态,threadStatus这个内部属性为0,在start方法中会判断这个内部属性是否为0,若是不等于0会发生异常,因此说不能重复调用start方法或者在线程 结束后从新start。
  2. 线程启动后会被加入到一个线程组中,若是没有指定特定的线程组,会默认加入currentThread的线程组中。
相关文章
相关标签/搜索