CompletableFuture异步线程
1、线程池七大参数介绍
(1)corePoolSize:线程池中常驻核心线程数
(2)maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值必须大于等于1
(3)keepAliveTime:多余的空闲线程存活时间。当前线程池数量超过corePoolSize时,当空闲时间到达keepAliveTime值时,多余空闲线程会被销毁直到只剩下corePoolSize个线程为止。
(4)unit:keepAliveTime的时间单位
(5)BlockingQueue:阻塞队列,如果任务很多,就将在目前多的任务放在队列里。只要有空闲,就回去队列里去除最新的任务执行。
(6)threadFactory:表示生成线程池中的工作线程的线程工厂,用于创建线程,一般为默认线程工厂即可
(7)handler:拒绝策略,表示当队列满了并且工作线程大于等于线程池的最大线程数(maximumPoolSize)时如何来拒绝来请求的Runnable的策略
2、运行顺序
1、线程池创建,准备好core数量的核心线程,准备接受任务。
2、新的任务进来,用core准备好的空闲线程执行。
(1)、core满了,就将再进来的任务放入阻塞队列中。空闲的core就会自己去阻塞队
列获取任务执行
(2)、阻塞队列满了,就直接开新线程执行,最大只能开到ma指定的数量
(3)、max都执行好了。max-core数量空闲的线程会在 keepAliveTime指定的时间后自
动销毁。最终保持到core大小
(4)、如果线程数开到了max的数量,还有新任务进来,就会使用 reject指定的拒绝策
略进行处理
3、所有的线程创建都是由指定的 factory创建的。
3、异步对象
CompletableFuture提供了四个静态方法来创建一个异步操作。
1、static CompletableFuture<void> runAsync(Runnable runnable)
2、public static CompletableFuture <void> runAsync(Runnable runnable, Executor executor)
3、public static <U> CompletableFuture<U> SupplyAsync(Supplier <U> supplier)
4、 public static <U> CompletableFuture<U> supplyAsync(Supplier <U> supplier, Executor executor)
runXxoox都是没有返回结果的, supplyXox都是可以获取返回结果的
4、计算完成时回调方法
public CompletableFuture<T> whenCompleteBiConsumer<? super T,? super Throwable> action);
public CompletableFuture<T> whenCompleteAsyn(BiConsumer<? super T,? super Throwable>action):
public CompletableFuture<T> whenCompleteAsyncBiconsumer<? super T,? super Throwable>action, Executor executor);
public CompletableFuture<T> exceptionallyFunction<Throwable, extends T> fn);
whenComplete可以处理正常和异常的计算结果但是无法修改返回数据, exceptionally处理异常情况并且可以修改返回数据。
whenComplete和 whenCompleteAsync的区别:
- whenComplete:是执行当前任务的线程执行继续执行 whenComplete的任务。
- whenCompleteAsync:是执行把 whenCompleteAsync这个任务继续提交给线程池来进行执行。
方法不以 Async结尾,意味着 Action使用相同的线程执行,而 Async可能会使用其他线程执行(如果是使用相同的线程池,也可能会被同一个线程选中执行)
5、 handle方法
public Completionstage< handleBiFunction<? super T, Throwable, extends U> fn):
public <U> CompletionstagecU> handleAsyneBiFunction<? super T, Throwable, extends U> fn);
public <U> CompletionstagecU> handleAsyncBiFunction<? super T, Throwable, extends U> fn, Executor executor);
- 和 complete一样,可对结果做最后的处理(可处理异常),可改变返回值。
6、两任务组合-都要完成
public <U,V> CompletableFuturec <V> thenCombine( Completionstage< ? extends U> other, BiFunction<? super T,? super U,? extends> fn);
public<U,V> CompletableFuture <V> thenCombineAsync( CompletionStage<? extends> other, BiFunction<? super T.? super U,? extends> fn);
public <U,V> CompletableFuture<V> thenCombineAsync(CompletionStage<? extends U> other, BiFunction<? super T,? super U,? extends> fn, Executor executor);
public <U> CompletableFuture<Void> thenAcceptBoth(Completionstage<? extends U> other,Biconsumer< super T, super> action);
public <U> CompletableFuturevoid <Void> thenAcceptBothasync(Completionstage<? extends U> other, Biconsumer<? super T, super U> action);
public <U> CompletableFuture<Void> thenAcceptBothasync(Completionstage<? extends U> other,Biconsumer<? super T, super Uaction, Executor executor);
public CompletableFuture<Void> runAfterBotl(Completionstage<?> other,Runnable action);
public CompletableFuture<Void> runAfterBothAsync(CompletionStage<?> other, Runnable action);
public CompletableFuture<Void> runAfterBothAsync(Completionstage<?> other,Runnable action, Executor executor);
- 两个任务必须都完成,触发该任务。
- thenCombine:组合两个 future,获取两个 future的返回结果,并返回当前任务的返回值;
- thenAcceptBoth:组合两个 future,获取两个 future任务的返回结果,然后处理任务,没有返回值;
- runAfterBoth:组合两个 future,不需要获取 future的结果,只需两个future处理完任务后,处理该任务。
7、多任务组合
public static CompletableFuture<> allof(CompletableFuture<?>... cfs);
public static CompletableFuture> anyof(CompletableFuture<>...cfs);
- allof:等待所有任务完成
- anyOf:只要有一个任务完成
CompletableFuture异步线程的更多相关文章
- 使用 CompletableFuture 异步组装数据
使用 CompletableFuture 异步组装数据 一种快捷.优雅的异步组装数据方式 实际项目中经常遇到这种情况: 从多个表中查找到数据然后拼装成一个VO返回给前端. 这个过程有可能会非常耗时.因 ...
- CompletableFuture异步编排
什么是CompletableFuture CompletableFuture是JDK8提供的Future增强类.CompletableFuture异步任务执行线程池,默认是把异步任务都放在ForkJo ...
- 卸载AppDomain动态调用DLL异步线程执行失败
应用场景 动态调用DLL中的类,执行类的方法实现业务插件功能 使用Assembly 来实现 但是会出现逻辑线程数异常的问题 使用AppDomain 实现动态调用,并卸载. 发现问题某个插件中开启异步线 ...
- net异步线程获取返回值的三种方式
方式一:endInvoke using System; using System.Collections.Generic; using System.Text; using System.Thread ...
- AsyncTask实现异步线程通信
AsyncTask是Android1.5开始提供的一个封装了Thread与Handler可以实现异步线程的简单方式,不需要再自己实现子线程,然后在主线程处接受数据. 因为AsyncTask是用线程池, ...
- 安卓 异步线程更新Ui
异步跟新UI: 1.handler+Thread(runnable):如果handler和Thread都写在了一个Java文件中,就不说了,如果runnable定义在了一个单独的类文件中,可以通过在构 ...
- 关于GCD同步组实现多个异步线程的同步执行中的注意点
在App开发中经常会遇到多个线程同时向服务器取数据, 如果每个线程取得数据后都去刷新UI会造成界面的闪烁 也有可能出现部分数据还没有获取完毕造成程序crash 之前在网上看到很多是利用dispatch ...
- 线程池内的异步线程创建UI控件,造成UI线程卡死无响应的问题分析
winform应用在使用一段时间后,切换到其他系统或者打开word.excel文档,再切换回winform应用时,系统有时出现不响应的现象.有时在锁屏后恢复桌面及应用时也发生此问题. 经微软支持确认, ...
- Eclipse RCP中超长任务单线程,异步线程处理
转自:http://www.blogjava.net/mydearvivian/articles/246028.html 在RCP程序中,常碰到某个线程执行时间比较很长的情况,若处理不好,用户体验度是 ...
随机推荐
- 详解Vue大护法——组件
1.什么是组件化 人面对复杂问题的处理方式: 任何一个人处理信息的逻辑能力都是有限的 所以,当面对一个非常复杂的问题时,我们不太可能一次性搞定一大堆的内容. 但是,我们人有一种天生的能力,就是将问题进 ...
- 大型Java进阶专题(八)设计模式之适配器模式、装饰者模式和观察者模式
前言 今天开始我们专题的第八课了.本章节将介绍:三个设计模式,适配器模式.装饰者模式和观察者模式.通过学习适配器模式,可以优雅的解决代码功能的兼容问题.另外有重构需求的人群一定需要掌握装饰者模式. ...
- 大型Java进阶专题(九) 设计模式之总结
前言 关于设计模式的文章就到这里了,学习这门多设计模式,你是不是有这样的疑惑,发现很多设计模式很类似,经常会混淆某些设计模式.这章节我们将对设计模式做一个总结,看看各类设计模式有什么区别.需要注意 ...
- sql数据管理语句
一.数据管理 1.增加数据 INSERT INTO student VALUES(1,'张三','男',20); -- 插入所有字段.一定依次按顺序插入 -- 注意不能少或多字段值 如只需要插入部分字 ...
- 如何使用k3OS和Argo进行自动化边缘部署?
本文转自边缘计算k3s社区 前 言 随着Kubernetes生态系统的发展,新的技术正在被开发出来,以实现更广泛的应用和用例.边缘计算的发展推动了对其中一些技术的需求,以实现将Kubernetes部署 ...
- 1-Numpy的通用函数(ufunc)
一.numpy“通用函数”(ufunc)包括以下几种: 元素级函数(一元函数):对数组中的每个元素进行运算 数组级函数:统计函数,像聚合函数(例如:求和.求平均) 矩阵运算 随机生成函数 常用一元通用 ...
- day20:正则表达式
单个字符的匹配 findall(正则表达式,字符串) 把符合正则表达式的字符串存在列表中返回 预定义字符集(8) \d 匹配数字 \D 匹配非数字 \w 匹配数字字母下划线 \W 匹配非数字或字母或下 ...
- MySQL一主多从配置和读写分离配置
一.一主多从配置 此次操作实现的是一主两从的方式.主服务器slave2(2.100),从服务器slave2-1(2.107),slave2-2(2.108);第一:准备主数据库 1. 在不同的机 ...
- 关于tf.cond函数中“正确”与“错误”函数中的普通python语句始终执行的问题
import tensorflow as tf import numpy as np x = tf.constant(2) y = tf.constant(3) global mask0 mask0 ...
- 4.深入k8s:容器持久化存储
从一个例子入手PV.PVC Kubernetes 项目引入了一组叫作 Persistent Volume Claim(PVC)和 Persistent Volume(PV)的 API 对象用于管理存储 ...