java高并发编程详解-第一章多线程基础

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40646143/article/details/90691912

线程介绍

  • 现在几乎100%的操作系统都支持多任务的执行,对计算机来说每一个任务就是一个进程(Process),在每一个进程内部至少要有一个线程(Thread)是在运行中,有时线程也称为轻量级的进程。
  • 线程是程序执行的一个路径,每一个线程都有自己的局部变量表,程序计算器(指向正在执行的指令指针)以及各自的生命周期,现代操作系统中一般不止一个线程在运行,当启动一个java虚拟机,从操作系统开始就会创建一个新的进程(JVM进程),JVM进程中将会派生或者创建很多线程。

线程的生命周期详解

对Thread进行介绍

  1. NEW
  2. RUNNABLE
  3. RUNNING
  4. BLOCKED
  5. TERMINATED

1.1 线程的NEW状态

       当我们用关键字new创建一个Thread对象时,此时它并不处于执行状态,因为没有调用start方法启动该线程,那么线程的状态NEW状态,准确的说,它只是Thread对象的状态,因为没有start之前,该线程根本不存在,与你用关键字new创建一个普通的java对象没有区别。

      NEW状态通过start方法进入RUNNABLE状态。

2.1 线程的RUNNABLE状态

       线程对象进入RUNNABLE状态必须调用 start 方法,那么此时才是真正地在 JVM 进程中创建一个线程,线程一经启动就可以立即得到执行吗?答案是否定的,线程的运行与否和进程一样都要听令与CPU调度,那么我们把这个中间状态称为可执行状态(RUNNABLE),也就是说它具备执行的资格,但是并没有真正地执行起来而是在等待CPU的调度。

      由于存在 Running 状态,所以不会直接进入 BLOCKED 状态和 TERMINATED 状态,即使是在线程的执行逻辑中调用 wait,sleep或者其他 block 的 IO 操作等,也必须先获取CPU的调度执行权才可以,严格来讲,RUNNABLE的线程只能意外终止或者进入RUNNING状态。

3.1 线程的RUNNING状态

       一旦CPU通过轮询或者其他方式从任务可执行队列中选中了线程,那么此时它才能真正执行自己的逻辑代码,需要说明的一点是一个正在RUNNING状态的线程事实上也是RUNNABLE的,但是反过来则不成立。

在该状态中,线程的状态可以发生如下的状态转换:

  • 直接进入 TERMINATER 状态,比如说调用 JDK 已经不推荐使用 stop 方法,或者判断某个逻辑标识
  • 进入 BLOCKED 状态,比如说调用了 sleep ,或者 wait 方法而加入了 waitSet 中
  • 进行某个阻塞的 IO 操作,比如说因网络数据的读写进入BLOCKED状态
  • 获取某个锁资源,从而加入到该锁的阻塞队列中而进入了BLOCKED状态
  • 由于CPU的调度器轮询使该线程放弃执行,进入RUNNABLE状态
  • 线程主动调用 yield 方法,放弃使用CPU执行权,进入RUNNABLE状态

4.1 线程的BLOCKED状态

  • 直接进入 TERMINATER 状态,比如调用 JDK 已经不推荐使用的stop方法或者意外进入死亡
  • 线程阻塞的操作结束,比如读取了想要的数据字节进入到RUNNABLE状态
  • 线程完成了指定时间的休眠,进入到了RUNNABLE状态
  • Wait中的线程被其他线程notify/notifyall唤醒,进入到RUNNABLE状态
  • 线程获取到了某个锁资源,进入了RUNNABLE状态
  • 线程在阻塞过程中被打断,比如其他线程中调用了interrrupt方法,进入RUNABLE状态

5.1线程的TERMINATED状态

       TERMINATED是线程的最终状态,在该状态中线程将不会切换到其他任何状态,线程进入TERMINATED状态,意味着该线程的整个生命周期都结束了,下列这些情况将会使线程进入RUNMINATED状态

  • 线程运行正常结束,结束生命周期
  • 线程运行出错意外结束
  • JVM Crash,导致所有得线程都结束

总结

  • 创建线程有俩种方式,一种是创建一个Thread,一种是实现Runnable接口,这种说法不谨慎的。准确来讲,创建线程只有一种方式那就是构造Thread类,而实现线程的执行单元则有俩种方式,第一种是重写Thread的run方法,第二种就是实现Runnable接口的run方法,并将Runnable实例用户构造Thread的参数。

     线程Thread类run方法与Runnable接口的run方法区别?

  • Thread类的run方法是不能共享的,也就是说A线程不能把B线程的run方法当做自己的执行单元而Runnable接口则很容易实现这一点,使用同一个Runnable的实例构造不同的Thread实例。

猜你喜欢

转载自blog.csdn.net/qq_40646143/article/details/90691912