2022谷粒商城学习笔记(十七)异步和线程池

前言

本系列博客基于B站谷粒商城,只作为本人学习总结使用。这里我会比较注重业务逻辑的编写和相关配置的流程。有问题可以评论或者联系我互相交流。原视频地址谷粒商城雷丰阳版。本人git仓库地址Draknessssw的谷粒商城


线程池

1)、继承 Thread
2)、实现 Runnable 接口
3)、实现 Callable 接口 + FutureTask (可以拿到返回结果,可以处理异常)
4)、线程池

方式 1 和方式 2:主进程无法获取线程的运算结果。不适合当前场景 方式 3:主进程可以获取线程的运算结果,但是不利于控制服务器中的线程资源。可以导致 服务器资源耗尽。 方式 4:通过如下两种方式初始化线程池

Executors.newFiexedThreadPool(3); //或者

new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit unit, workQueue, threadFactory, handler);


参数:

@param corePoolSize
池中一直保持的线程的数量,即使线程空闲。除非设置了 allowCoreThreadTimeOut

@param maximumPoolSize
池中允许的最大的线程数
@param keepAliveTime
当线程数大于核心线程数的时候,线程在最大多长时间没有接到新任务就会终止释放, 最终线程池维持在 corePoolSize 大小
@param unit
时间单位
@param workQueue
阻塞队列,用来存储等待执行的任务,如果当前对线程的需求超过了 corePoolSize 大小,就会放在这里等待空闲线程执行。
@param threadFactory
创建线程的工厂,比如指定线程名等
@param handler
拒绝策略,如果线程满了,线程池就会使用拒绝策略。


运行流程:

1、线程池创建,准备好 core 数量的核心线程,准备接受任务
2、新的任务进来,用 core 准备好的空闲线程执行。
(1) 、core 满了,就将再进来的任务放入阻塞队列中。空闲的 core 就会自己去阻塞队 列获取任务执行
(2) 、阻塞队列满了,就直接开新线程执行,最大只能开到 max 指定的数量
(3) 、max 都执行好了。Max-core 数量空闲的线程会在 keepAliveTime 指定的时间后自 动销毁。最终保持到 core 大小
(4) 、如果线程数开到了 max 的数量,还有新任务进来,就会使用 reject 指定的拒绝策 略进行处理 3、所有的线程创建都是由指定的 factory 创建的。


常见的 4 种线程池:

1、newCachedThreadPool
 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若 无可回收,则新建线程。

2、newFixedThreadPool
 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

3、newScheduledThreadPool
 创建一个定长线程池,支持定时及周期性任务执行。

4、newSingleThreadExecutor
 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务 按照指定顺序(FIFO, LIFO, 优先级)执行。


开发中为什么使用线程池

降低资源的消耗、提高响应速度、提高线程的可管理性


CompletableFuture 异步编排

业务场景:

假如商品详情页的每个查询,需要如下标注的时间才能完成 那么,用户需要 5.5s 后才能看到商品详情页的内容。很显然是不能接受的。 如果有多个线程同时完成这 6 步操作,也许只需要 1.5s 即可完成响应。

2022谷粒商城学习笔记(十七)异步和线程池_第1张图片

2022谷粒商城学习笔记(十七)异步和线程池_第2张图片


CompletableFuture 提供了四个静态方法来创建一个异步操作
2022谷粒商城学习笔记(十七)异步和线程池_第3张图片
1、runXxxx 都是没有返回结果的,supplyXxx 都是可以获取返回结果的(可以对获取的结果进行操作)
2、可以传入自定义的线程池,否则就用默认的线程池;


计算完成时回调方法
2022谷粒商城学习笔记(十七)异步和线程池_第4张图片
2022谷粒商城学习笔记(十七)异步和线程池_第5张图片


handle 方法
2022谷粒商城学习笔记(十七)异步和线程池_第6张图片
2022谷粒商城学习笔记(十七)异步和线程池_第7张图片


线程串行化方法

2022谷粒商城学习笔记(十七)异步和线程池_第8张图片
U:当前任务的返回值类型

2022谷粒商城学习笔记(十七)异步和线程池_第9张图片


两任务组合 - 都要完成

2022谷粒商城学习笔记(十七)异步和线程池_第10张图片

2022谷粒商城学习笔记(十七)异步和线程池_第11张图片
2022谷粒商城学习笔记(十七)异步和线程池_第12张图片


两任务组合 - 一个完成

2022谷粒商城学习笔记(十七)异步和线程池_第13张图片
2022谷粒商城学习笔记(十七)异步和线程池_第14张图片


多任务组合

2022谷粒商城学习笔记(十七)异步和线程池_第15张图片

你可能感兴趣的:(B站谷粒商城,学习,java,线程池)