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异步线程的更多相关文章

  1. 使用 CompletableFuture 异步组装数据

    使用 CompletableFuture 异步组装数据 一种快捷.优雅的异步组装数据方式 实际项目中经常遇到这种情况: 从多个表中查找到数据然后拼装成一个VO返回给前端. 这个过程有可能会非常耗时.因 ...

  2. CompletableFuture异步编排

    什么是CompletableFuture CompletableFuture是JDK8提供的Future增强类.CompletableFuture异步任务执行线程池,默认是把异步任务都放在ForkJo ...

  3. 卸载AppDomain动态调用DLL异步线程执行失败

    应用场景 动态调用DLL中的类,执行类的方法实现业务插件功能 使用Assembly 来实现 但是会出现逻辑线程数异常的问题 使用AppDomain 实现动态调用,并卸载. 发现问题某个插件中开启异步线 ...

  4. net异步线程获取返回值的三种方式

    方式一:endInvoke using System; using System.Collections.Generic; using System.Text; using System.Thread ...

  5. AsyncTask实现异步线程通信

    AsyncTask是Android1.5开始提供的一个封装了Thread与Handler可以实现异步线程的简单方式,不需要再自己实现子线程,然后在主线程处接受数据. 因为AsyncTask是用线程池, ...

  6. 安卓 异步线程更新Ui

    异步跟新UI: 1.handler+Thread(runnable):如果handler和Thread都写在了一个Java文件中,就不说了,如果runnable定义在了一个单独的类文件中,可以通过在构 ...

  7. 关于GCD同步组实现多个异步线程的同步执行中的注意点

    在App开发中经常会遇到多个线程同时向服务器取数据, 如果每个线程取得数据后都去刷新UI会造成界面的闪烁 也有可能出现部分数据还没有获取完毕造成程序crash 之前在网上看到很多是利用dispatch ...

  8. 线程池内的异步线程创建UI控件,造成UI线程卡死无响应的问题分析

    winform应用在使用一段时间后,切换到其他系统或者打开word.excel文档,再切换回winform应用时,系统有时出现不响应的现象.有时在锁屏后恢复桌面及应用时也发生此问题. 经微软支持确认, ...

  9. Eclipse RCP中超长任务单线程,异步线程处理

    转自:http://www.blogjava.net/mydearvivian/articles/246028.html 在RCP程序中,常碰到某个线程执行时间比较很长的情况,若处理不好,用户体验度是 ...

随机推荐

  1. CUDA C++ Extensions

    敲代码的时候总是会去CUDA官方文档中找找思路,感觉每次看英文文档都要耗费一点时间来翻译,干脆自己翻译一下便于以后查阅.官方文档:cuda-c-language-extensions 目录 函数修饰符 ...

  2. xenomai内核解析--双核系统调用(三)--如何为xenomai添加一个系统调用

    版权声明:本文为本文为博主原创文章,转载请注明出处.如有错误,欢迎指正. @ 目录 一.添加系统调用 二.Cobalt库添加接口 三.应用使用 一.添加系统调用 下面给xenomai添加一个系统调用g ...

  3. ES6面试

    未完持续 概念 ECMAScript6(以下简称ES6)是 JavaScript 语言的下一代标准,前者是后者的规格,后者是前者的一种实现. ES6(新增的)一些特性 1.变.常量:let声明变量,c ...

  4. python-在python3中使用容联云通讯发送短信验证码

    容联云通讯是第三方平台,能够提供短信验证码和语音通信等功能,这里只测试使用短信验证码的功能,因此只需完成注册登录(无需实名认证等)即可使用其短信验证码免费测试服务,不过免费测试服务只能给控制台中指定的 ...

  5. 新款iPad Pro4的电池续航和充电速度对比

    3月18日晚苹果官网上架了两款新iPad Pro,两款iPad Pro 2020外观大小分别为11英寸和12.9英寸,搭载苹果A12Z仿生芯片,起售价分别为6288元和7899元.那么两款iPad P ...

  6. Cypress系列(41)- Cypress 的测试报告

    如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html 注意 51 testting 有一篇文章 ...

  7. Java的常用类——Object类、String类

    Java的JDK中提供给我们很多封装好的类就是Java API,可以直接调用. Java 的API(API: Application(应用) Programming(程序) Interface(接口) ...

  8. PHP date_timezone_get() 函数

    ------------恢复内容开始------------ 实例 返回给定 DateTime 对象的时区: <?php$date=date_create(null,timezone_open( ...

  9. C/C++编程笔记:C语言自增(++)和自减(--)运算符详解,笔记分享

    一个整数类型的变量自身加 1 可以这样写: a = a + 1; 或者 a += 1; 不过,C语言还支持另外一种更加简洁的写法,就是: a++; 或者 ++a; 这种写法叫做自加或自增,意思很明确, ...

  10. Netty(一):server启动流程解析

    netty作为一个被广泛应用的通信框架,有必要我们多了解一点. 实际上netty的几个重要的技术亮点: 1. reactor的线程模型; 2. 安全有效的nio非阻塞io模型应用; 3. pipeli ...