线程是什么?
进程与线程
进程是操作系统资源分配的最小单位
线程是操作系统运算调度的最小单位
java 是内置多线程编程模型的
线程分类
- 用户线程:大多数线程都是用户线程,用于完成业务功能
-
守护线程:支持型线程,主要用于后台调度以及支持性工作,比如GC线程,当JVM中不存在非守护线程时,JVM将会退出
Thread.setDaemon(true)来设置线程属性为守护线程,该操作必须在线程调用start()方法之前执行
守护线程中的finally代码块不一定会执行,因此不要寄托于守护线程中的finally代码块来完成资源的释放
线程使用场景
多线程的应用场景
出现需要长时间等待的操作:如文件io
出现可分解的大任务:如元数据采集,数据质量检核
出现需要后台运行的任务:如监测任务,定时任务
线程怎么用?
自定义线程的实现
- 继承 Thread 类
- 实现 Runnable 接口
- 实现 Callable 接口(有返回值,适配器模式,本质上都是 Thread.start())
线程的生命周期
- New
- Runnable
- Waiting
- Timed Waiting
- Blocked
- Terminated
线程的状态转换

线程调度
线程调度是指:系统为线程分配处理器使用权限的过程
主要调度方式:
- 抢占式(java 默认,执行时间由系统控制,线程本身无法左右)
- 协同式(执行时间由系统控制,线程本身可以通知系统当前线程任务结束,但仍然无法左右)
线程安全
线程安全的定义:
简单来说,线程安全就是对于多个线程并发执行的操作不需要进行任何外部的控制,也不需要进行任何的协调,就能够保证程序的执行结果与开发人员的预期结果保持一致,那么这个多线程程序就是线程安全的;
注意:
线程安全问题一定是基于多个线程之间存在访问共享数据这一前提下的;如果多个线程之间不会访问同一个变量,那么就不存在线程安全的问题;
线程安全分类:
- 不可变
- 绝对线程安全
- 相对线程安全:Java API中标注为线程安全的类,大多数都是相对的线程安全,也就是通常意义上的线程安全,保证对共享变量单独操作时是线程安全的,调用时可以不用额外的保障措施;例如Vector、HashTable或通过Collections的synchronizedCollection()方法包装的集合等;
- 线程兼容:线程兼容指对象本身并不是线程安全的,但是**可以通过在调用端正确采用同步手段来保证对象在并发环境中可以安全地使用,是通常意义上的非线程安全;Java API中的大部分类都是线程兼容的,**例如ArrayList、HashMap等;
- 线程对立
线程安全问题的解决方法
java.util.concurrent包
- synchronized
- ReadWriteLock/StampedLock
- Concurrent集合
- 线程池(Executors 与 Future)
线程间通信
等待通知机制
- wait()
- notifyAll()
生产者消费者模式
线程交互的方式
- join
- sleep/interrupt
- wait/notify
参考资料
https://blog.csdn.net/boker_han/article/details/82918881?spm=1001.2014.3001.5506
https://blog.csdn.net/boker_han/article/details/79466524
https://blog.csdn.net/boker_han/article/details/82318150
https://blog.csdn.net/boker_han/article/details/82354219?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control
https://blog.csdn.net/qq_22136439/article/details/104427003
https://blog.csdn.net/qq_22136439/article/details/104427259
https://blog.csdn.net/qq_22136439/article/details/104444867?spm=1001.2014.3001.5506