深入理解Java线程

12 篇文章 0 订阅
12 篇文章 2 订阅

笔记大纲

1.进程与线程

在这里插入图片描述
进程:操作系统分配资源的最小单元,是一个程序在操作系统的一个实例抽象。
线程:是CPU调度执行最小单元,一个进程可包含多个线程,是一个指令序列。

1.1 内核态与用户态

用户态:程序运行在用户空间,也只能访问到用户空间的数据。
内核态:程序运行在内核空间,拥有所有资源的访问权限。

1.2 上下文切换

进程(线程)的上下文切换只能发生在内核模式下。
在这里插入图片描述

上下文切换主要有三个步骤:
1.暂停当前进程的处理,将该进程的CPU状态存储到内存中PCB。
2.从内存中取出下一个要执行的进程,在CPU寄存器中恢复它。
3.返回到程序计数器指示的位置,恢复执行。

2.线程的生命周期

2.1 操作系统线程生命周期

在这里插入图片描述

初始状态:线程对象创建成功,高级语言层面的线程对象已经初始化完成,但是操作系统内核暂时还不能分配CPU资源,内核线程还没有与之绑定或者创建。
就绪状态:线程已经就绪完毕,随时可以进行运行,等待CPU的调度。
运行状态:线程获得CPU的时间片资源,正在执行指令序列。
阻塞状态:运行状态的线程调用了一些阻塞API,例如睡眠、挂起等,就会处于阻塞状态。
终止状态:线程将其指令序列执行完毕或者遇到异常进入终止状态。

五种状态机模型在不同的高级语言层面可能有不同的合并或拆分,例如Java的线程Threa状态就有6种。

2.2 Java语言层面线程生命周期

在这里插入图片描述

初始状态:Java程序new一个Thread对象,内存中线程对象就是初始状态。
运行状态:合并了就绪状态和运行状态,因为Java线程交给了操作系统调度,所以这两者合并了。
无限期等待:程序调用wait()、join()、park()等无参方法,线程处于阻塞状态,等待唤醒。
有限期等待:程序调用wait(int)、join(int)、park(int)等带参方法,线程处于阻塞状态,等待超时或唤醒。
阻塞:线程阻塞于内置锁,直到抢占到内置锁synchronized。
终止状态:线程将其指令序列执行完毕或者遇到异常进入终止状态。

3.Java线程 - Thread

3.1 Java线程实现方式

3.1.1 继承Thread类,覆盖run()方法。

3.2.2 实现Runnable接口,覆盖run()方法。

Runnable和Thread最大的区别就是一个是线程的抽象,一个是任务的抽象。

3.2.3 实现Callable接口,覆盖call()方法。

callable相对于runnable,callable在线程池中提交任务,并且支持future返回值,支持抛异常。

3.2 线程的优先级

Java线程可以设置其优先级,这个优先级并不能完全保证现在的调度优先级,因为不同的操作系统和不同的高级语言对优先级有不同的评定和分层,Java有10个优先级别。

3.3 用户线程和守护线程

创建出来的Thread默认都是用户线程,线程可以通过调用setDaemon来设置该线程是否为守护线程,守护线程会在创建它的线程执行完毕以后自动销毁。

3.4 线程的启动流程 start()

start()和run()方法的本质区别是,start方法时Java线程运行的唯一方式,run方法时普通的java方法,里面包装了线程要执行的指令序列。
在这里插入图片描述

3.5 sleep()方法

        - 使线程从运行状态变为有限期等待状态,不会释放对象锁。
        - 其它线程可以掉用该线程的`interrupt`方法来中断该睡眠线程,此时会抛出`interruptedException`异常,并且会清除中断标志。
        - 睡眠到点以后,线程处于就绪状态,等待CPU调度。
        - 当sleep()传入的等待时间为0时,和yield()相同。

3.6 yield()方法

        - 释放CPU时间片资源,线程从运行状态变为就绪状态,不会释放对象锁。

3.7 join()方法

        - B线程调用A线程的join方法,可以让B线程等待A线程执行完毕以后再继续执行。

3.8 stop()方法(不推荐)

强制终止运行中的线程,会释放锁资源,但JDK不建议使用,因为暴力终止可能造成程序紊乱。

4.Java线程的中断机制 interrupt

Java没有提供一种安全的方法来停止某个线程,只是提供了中断机制,让用户决定是否以如何方式停止线程。

4.1 interrupt()方法

将线程的中断标志位置为true,线程并不会停下来。

4.2 isInterrupted()方法

判断当前线程中断标志位是否为true,不会清除中断标志位。

4.3 Thread.interrupted()静态方法

判断当前线程中断标志位是否为true,并清除标志位,置为false。

5.Java线程的通信

  - volatile的可见性机制来提供线程的通信。
  - 等待唤醒/等待通知机制:wait/notify
  - LockSupport.park()、LockSupport.unpark()
  - 管道输入输出流
  - Thread.join()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Minor王智

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值