商城业务-异步-线程池详解
一、线程问题
1. 线程池可以控制资源,性能稳定(ThreadPoolExecutor)
2. 七大参数:
- corePoolSize:[5]核心线程数
- maximumPoolSize:[200] 最大线程数,控制资源
- keepAliveTime:存活时间。如果当前线程数量大于core数量,线程会根据keepAliveTime的值进行活性检查,释放空闲的线程。
- unit:时间单位
- BlockingQueue<Runnable> workQueue:阻塞队列。如果任务有很多,就会将目前多的任务放在队列里面。只要有线程空闲,就会去队列里面取出新的任务继续执行。
- threadFactory:线程的创建工厂。
- handler:如果队列满了,按照指定的拒绝策略拒绝执行任务。
3. 工作顺序:
- 线程池创建好,准备好core的核心线程,准备接受任务
- 新的任务进来,用core准备好的空闲线程执行
- core满了,就将再进来的任务放入阻塞队列中,空闲的core就会自己去阻塞队列获取任务执行
- 阻塞队列满了,就直接开新线程执行,最大只能开到max指定的数量。
- max满了,还有新任务进来,就会使用reject指定的拒绝策略进行处理
- max都执行完成,有很多空闲,在指定的keepAliveTime以后,释放max-core这些线程
4. 常见的四种线程池(Executors.)
- newCachedThreadPool():core是0,所有都可回收
- newFixedThreadPool():固定大小,core=max;都不可回收 √
- newScheduledThreadPool():定时任务的线程池
- newSingleThreadExecutor():单线程的线程池,后台从队列中获取任务,挨个执行
5. 开发中为什么使用线程池
- 降低资源的损耗:通过重复利用已经创建好的线程降低线程的创建和销毁带来的损耗
- 提高响应速度
- 提高线程的可管理性
二、CompletableFuture异步编排
1. 创建异步对象
CompletableFuture提供了四个静态方法来创建一个异步操作
- runAsync(Runnable runnable)
- runAsync(Runnable runnable,Executor executor)
- supplyAsync(Supplier<T> supplier)
- supplyAsync(Supplier<U> supplier, Executor executor)
- runAsync都是没有返回结果的,supplyAsync都是可以返回结果的
- 可以传入自定义的线程池,否则就用默认的线程池
2. 计算完成时回调方法
whenComplete可以处理正常和异常的计算结果,exceptionally处理异常情况。
3. handle方法
和complete一样,可以对结果做最后的处理(可处理异常),可改变返回值
4. 线程串行化方法
5.两任务组合-都要完成
使用CompletableFuture和线程池实现异步编排
文章详细介绍了线程池的概念和参数,如核心线程数、最大线程数、存活时间等,以及不同类型的线程池。同时,讲解了CompletableFuture如何创建异步任务,包括runAsync、supplyAsync方法,以及计算完成后的回调方法如whenComplete和handle。
720

被折叠的 条评论
为什么被折叠?



