文章目录
前言
线程是什么?
Java中执行多线程编程
下面我们在 idea 中实践
准备工作 : 在 idea中 创建一个 Java 项目
Thread 类的基本方法
拓展
Thread 类创建线程的写法
1、最基本的创建线程的办法
2、创建 一个类 实现 Runnable 接口,再创建Runnable实例 传给 Thread 实例
写法 3 和 写法 4 :就是上面两种写法的翻版 - 使用了匿名内部类。
写法3
写法4
小结
写法五
多线程的优势
我们下面一起来实践一下
总程序
Thread 类常见方法
Thread 的常见构造方法
Thread(String name) - 创建线程对象,并命名
Thread 的几个常见属性
是否后台线程 - isDaemon()
是否存活 - isAlive()
Thread 中的一些重要方法
start 方法 - 启动线程
经典面试题: start 与 run方法 的区别
中断一个线程
让线程结束有以下几个方法:
1、可以手动的设置一个标志位(自己创建一个变量,boolean 和 int 类型都行),来控制线程是否要执行的结果。
2、使用 Thread 中内置的一个标志位来进行判断来进行判定(比第一种方法更好)
线程等待
获取当前线程引用
线程休眠
线程的状态
1、NEW: 安排了工作, 还未开始行动
2、TERMINATED: 工作完成了.
小结
3、RUNNABLE: 可工作的. 又可以分成正在工作中和即将开始工作.
4、TIMED_WAITING: 这几个都表示排队等着其他事情
5、BLOCKED: 这几个都表示排队等着其他事情
6、WAITING: 这几个都表示排队等着其他事情
注意
线程状态和状态转移的意义
线程状态转换简略图
线程安全问题 - 重中之重
一个线程不安全的典型案例
解析
如何解决线程安全问题?
加锁 - synchronized
现在我们回过头来看,什么情况线程会不安全?
产生线程不安全的原因如下:
1、线程是抢占式执行,线程间的调度充满着随机性。【造成线程不安全的直接原因,而且是无法解决的问题】
2、**多个线程**对==同一个变量==进行==修改操作==。
解决办法
3、针对变量的操作不是原子的
4、内存可见性,也会影响到线程安全。
代码示例:针对 内存可见性 的线程安全问题
解决办法
1、加锁操作:使用 synchronized 关键字
2、volatile 关键字 - 必须会读会写这个关键字
5、指令重排序
小结
重点解析 - synchronized 关键字 - 监视器锁 monitor lock
synchronized 的 使用方式
1、直接修饰 普通方法。
2、修饰一个代码块
3、修饰一个静态方法
刷新内存
可重入
拓展 :死锁的其他场景
1、一个线程。一把锁
两个线程,两把锁
N个线程了,M把锁。
小结:死锁的四个必要条件
Java标准库中的线程安全类
线程不安全的类
线程安全的类
volatile 关键字
volatile 能保证你内存可见性
volatile 和 synchronized 的区别 - 面试会问到。
wait 和 notify :等待 和 通知
notifyAll
小结
关于多线程的案例
1、实现一个线程安全版本的单例模式
单例模式
单例模式的两种典型实现
1、饿汉模式
2、懒汉模式
拓展:进一步帮助你们理解 饿汉 和 懒汉模式
回过头,以上这些只是作为铺垫,真正要解决的问题是 实现一个线程安全的单例模式
案例二:阻塞队列
了解Java中 阻塞队列 的一些主要用法
模拟实现阻塞队列
总程序
为了观察程序的效果,我们再利用 阻塞队列 来构造一个 生产者和消费者模型
总程序(完整的生产者消费者模型 + 阻塞队列)
案例三 :定时器
标准库的定时器用法,
如何自己实现一个定时器
1、描述任务
组织任务
3、执行时间到了的任务
写到这里,上述代码中存在两个非常严重的问题!!!
总程序
案例四 :线程池
Java 保准库中,线程池的使用。
模拟实现一个线程池 - 基于 Executors来实现上面图片的效果
总程序
效果图
本文结束
文章目录
前言
线程是什么?
Java中执行多线程编程
下面我们在 idea 中实践
准备工作 :