为什么使用多线程
可以提高程序的效率,相当于多个人去完成一件事,肯定完成效率更快。
多线程适用场景
1.在高并发,分布式的开发下。
2.多线程下载技术。
3.异步发送信息。
4.异步响应,以多线程技术进行快速反应。
5.异步处理日志记录。
进程
进程相当于一个正在进行的程序,是并发执行的程序在执行过程中分配和管理资源的基本单位。
线程
线程是一个执行的小单元,也被称为“轻量级进程”,可以说一个进程至少有一个线程或多个线程。
多线程的并发
并发是指在同一个时间段内,多个线程进行交替执行,像多个人开工,最先开始这个人做,然后轮到另一个人去做,是有间隔性的,这是“多线程的并发”。
多线程的并行
并行是说在同一个时间内,多线程一起去执行运行,像多个人同时去开工做事,这是“多线程的并行”。
多线程遇到的问题
如何解决多个线程共享用一个全局变量,可能会被其他线程干扰,会存在线程安全问题。
使用 lock (悲观锁)或者 synchronize同步模块、cas无锁机制(乐观锁)解决问题。
如何解决死锁现象?
先采用诊断工具查看是否有死锁现象,若是发生死锁,进行停止操作。
多线程的复用机制
创建线程后,执行run()方法,然后不会立马停止线程,而是复用执行下一个任务。等同于一个线程执行多个任务,从而实现了复用机制。
多线程的生命周期
线程池的原理
提前预热创建固定的线程,一直保持在运行的状态,然后使用execute()会将任务去放入到队列里存放起来,之后在运行的线程去队列中获取任务,成功则执行run()方法。
为什么使用线程池
因为在项目中,频繁使用start()和stop()使用线程,容易对cpu造成很大的损耗**
线程池的优点
1.复用线程,减少频繁创建或stop
2.提高程序效率,减少了对cpu的损耗
3.统一管理了线程
线程池的创建方式
在项目中,一般情况不会使用“Start”启动线程,会使用线程池来进行管理,核心依赖Executors。
Executors封装了4种线程池方式,核心构造函数ThreadPoolExecuor,可根据ThreadPoolExecuor,来自定义封装线程池方式。
1.可缓存(将线程缓存起来,然后用来复用) Executors.newCachedThreadPool(); 最大线程数是Integer的最大值
2.自定义长度 Executors.newFixedThreadPool(线程数)
3.可定时 Executors.newScheduledThreadPool(“时间”)
4.单例 Executors.newSingleThreadExecutor()
示例:
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
scheduledThreadPool.schedule(new Runnable() {
@Override
public void run() {
System.out.println("延迟3s");
}
}, 3, TimeUnit.SECONDS);//表示延迟3秒执行
java里的队列
队列就相当于存放着固定类型的数据,遵循着先进先出的原则。
--------------------------------------From Clam Person Understanding ------------------------------------------------
--------------------------------------Only Reference For You -------------------------------------------------------------
--------------------------------------Also Hope To Get Your Advice ------------------------------------------------------