为什么要是使用多线程?
使用多线程有以下的好处:
-
提高处理速度: 多线程可以同时执行多个任务,将大型或耗时的任务分成几个并发的子任务来执行,从而减少总体执行时间。这对于需要处理大量数据或需要频繁进行 IO 操作的程序非常有用。
-
改善用户体验: 在用户界面中使用多线程可以保持界面的响应性,使得用户可以继续操作和与界面交互,而不会被单个任务的阻塞所影响。
-
充分利用多核处理器: 多线程可以有效地利用多核处理器的计算能力。通过将任务分配到不同的核心上并行执行,可以更好地利用硬件资源,提高系统整体的处理能力。
-
实现并发性: 多线程可以使程序同时执行多个任务,实现并发性。这对于需要同时处理多个请求、同时处理多个网络连接或同时执行多个计算任务等场景非常有用。
什么是多线程?
多线程是指在一个程序中同时运行多个线程的技术。线程是操作系统能够进行运算调度的最小单位,它被包含在进程中,是进程中的实际执行单位。
传统的单线程程序只能按照一定的顺序依次执行任务,而多线程程序可以同时运行多个线程,每个线程可以独立执行不同的任务。这意味着多个线程可以在同一时间进行不同的计算或操作,提高了程序的处理能力和效率。
线程和进程的区别?
进程就像是手机的应用软件。而线程是相当于应用软件中的不同的功能。
多线程的创建方式
创建的方式一共有四种
-
继承Thread类 ,重写run方法
-
实现Runable,重写run方法
-
实现Callable,重写call方法
-
创建线程池
线程池的工作流程(重要部分)
当有任务提交的时候,
- 判断是否到达核心线程数量,没有达到,创建工作线程来执行这个任务。
- 判断工作队列是否已满? 如果没有满,将提交新的任务放到工作队列中
- 判断线程池的最大线程数 是否达到? 如果没有,再创建工作线程来执行这个任务
- 最后,核心线程数 ,工作队列,最大线程数 ,没有满了,就执行拒绝策略来处理这个任务。
线程池的核心参数(重要)
一共有
- 核心线程数
- 最大线程数
- 阻塞队列
- 线程存活时间
- 临时线程存活时间单位
- 线程工厂
- 拒绝策略
其中拒绝策略又分为四种
- AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。 (默认)
- DiscardPolicy:丢弃任务,但是不抛出异常。如果线程队列已满,则后续提交的任务都会被丢弃,且是静默丢弃。
- DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务。
- CallerRunsPolicy:由调用线程处理该任务
线程的状态
新建、就绪、运行、阻塞、死亡
线程安全问题
容易出现共享数据问题
解决方案
使用锁,Synchronized 与 Lock
锁 的分类 为乐观锁 ,悲观锁 公平锁和非公平锁
线程通信
1,同步通信
2,异步通信
3,进程之间的通信性能
多线程并发
线程安全的特性
原子性:一个线程操作是不能被其他线程打断
有序性:线程在执行程序是有序的
可见性:一个线程修改数据后,对其他线程是可见的
使用volatile
保证可见性,可以在一个线程修改了共享数据时对其他线程可见,其原理就是修改了变量副本值后及时同步到主内存,其他线程从主内存中获取
保证有序性,会禁止指令重排 。指令重排:Java代码翻译成class文件后,最终在JVM执行时,是把class翻译一个个的指令进行执行的。而CPU为了程序的执行性能,会对指令进行重新排序
单例模式
使用双重校验锁