completablefuture

看一下“Dubbo 2.7”的三大新特性

匿名 (未验证) 提交于 2019-12-02 21:52:03
Dubbo 2.7.x 作为 Apache 的孵化版本,除了代码优化之外,还新增了许多重磅的新特性,本文将会介绍其中最典型的三个新特性: 一、异步化改造 二、三大中心改造 三、服务治理增强 一、异步支持优化 我们知道dubbo协议本身支持三种发送请求方式: 单向发送:执行方法不需要返回结果 同步发送:执行方法后,等待结果返回,否则一直阻塞. 异步发送:也就是当我发送调用后,我不阻塞等待结果,直接返回,将返回的future保存到上下文,方便后期使用。在异步发送中有两种方式分别是 future:当请求有响应后,通过future.get()来获得响应结果,但是future.get()会导致线程阻塞,future从RpcContext获取。 callback:设置一个回调线程,当接收到响应时,自动执行,不会对当前线程造成阻塞,自定义ResponseFuture支持callback。 2.6.x版本的异步方式提供了一些异步能力,包括Consumer端异步调用、参数回调、事件通知等。但当前的异步方式存在以下问题: Future获取方式不够直接,只能在RpcContext中进行获取; Future只支持阻塞式的get()接口获取结果。 Future接口无法实现自动回调,而自定义ResponseFuture虽支持callback回调但支持的异步场景有限,如不支持Future间的相互协调或组合等;

[高并发Java 十] JDK8对并发的新支持

吃可爱长大的小学妹 提交于 2019-12-01 09:46:46
1. LongAdder 和AtomicLong类似的使用方式,但是性能比 AtomicLong更好。 LongAdder与 AtomicLong都是使用了原子操作来提高性能。但是 LongAdder在 AtomicLong的基础上进行了热点分离,热点分离类似于有锁操作中的 减小锁粒度 ,将一个锁分离成若干个锁来提高性能。在无锁中,也可以用类似的方式来增加CAS的成功率,从而提高性能。 LongAdder原理图: AtomicLong的实现方式是内部有个value 变量,当多线程并发自增,自减时,均通过CAS 指令从机器指令级别操作保证并发的原子性。唯一会制约AtomicLong高效的原因是高并发,高并发意味着CAS的失败几率更高, 重试次数更多,越多线程重试,CAS失败几率又越高,变成恶性循环,AtomicLong效率降低。 而 LongAdder 将把一个value拆分成若干cell,把所有cell加起来,就是value。所以对 LongAdder进行加减操作,只需要对不同的cell来操作,不同的线程对不同的cell进行CAS操作,CAS的成功率当然高了(试想一下3+2+1=6,一个线程3+1,另一个线程2+1,最后是8, LongAdder没有乘法除法的API ) 。 可是在并发数不是很高的情况,拆分成若干的cell,还需要维护cell和求和,效率不如

CompletableFuture 组合式异步编程

半城伤御伤魂 提交于 2019-11-30 12:07:56
CompletableFuture 是jdk1.8引入的一个新特性。 它主要是为了解决多个 Future 结果之间的依赖关系。比如: 将两个异步计算合并为一个——这两个异步计算之间相互独立,同时第二个又依赖于第 一个的结果。 等待 Future 集合中的所有任务都完成。 仅等待 Future 集合中最快结束的任务完成(有可能因为它们试图通过不同的方式计算同 一个值),并返回它的结果。 通过编程方式完成一个 Future 任务的执行(即以手工设定异步操作结果的方式)。 应对Future的完成事件(即当 Future 的完成事件发生时会收到通知,并能使用 Future 计算的结果进行下一步的操作,不只是简单地阻塞等待操作的结果)。 runAsync 和 supplyAsync方法 CompletableFuture 提供了四个静态方法来创建一个异步操作。 public static CompletableFuture<Void> runAsync(Runnable runnable) public static CompletableFuture<Void> runAsync(Runnable runnable, Executor executor) public static <U> CompletableFuture<U> supplyAsync(Supplier<U>

CompletableFuture异步编程

a 夏天 提交于 2019-11-30 10:52:25
CompletableFuture 有什么用 CompletableFuture是用来描述多线程任务的时序关系的:串行关系,并行关系,聚合关系。 CompletableFuture 是Java 8 新增加的Api,该类实现,Future和CompletionStage两个接口,提供了非常强大的Future的扩展功能,可以帮助我们简化异步编程的复杂性,提供了函数式编程的能力,可以通过回调的方式处理计算结果,并且提供了转换和组合CompletableFuture的方法。 创建CompletableFuture对象 方式一:使用默认线程池 /** * 创建一个不带返回值得任务。 */ CompletableFuture<Void> f1 = CompletableFuture.runAsync(new Runnable() { @Override public void run() { //业务逻辑 } }); /** * 创建一个带返回值的任务。 */ CompletableFuture<String> f2 = CompletableFuture.supplyAsync(new Supplier<String>() { @Override public String get() { //业务逻辑 return null; } }); 方式二:使用自定义线程池(建议使用) /

Java 8 (10) CompletableFuture:组合式异步编程

送分小仙女□ 提交于 2019-11-29 10:12:15
Java 8 (10) CompletableFuture:组合式异步编程   随着多核处理器的出现,提升应用程序的处理速度最有效的方式就是可以编写出发挥多核能力的软件,我们已经可以通过切分大型的任务,让每个子任务并行运行,使用线程的方式,分支/合并框架(java 7) 和并行流(java 8)来实现。 现在很多大型的互联网公司都对外提供了API服务,比如百度的地图,微博的新闻,天气预报等等。很少有网站或网络应用汇以完全隔离的方式工作,而是采用混聚的方式:它会使用来自多个源的内容,将这些内容聚合在一起,方便用户使用。 比如实现一个功能,你需要在微博中搜索某个新闻,然后根据当前坐标获取天气预报。这些调用第三方信息的时候,不想因为等待搜索新闻时,放弃对获取天气预报的处理,于是我们可以使用 分支/合并框架 及并行流 来并行处理,将他们切分为多个子操作,在多个不同的核、CPU甚至是机器上并行的执行这些子操作。 相反,如果你想实现并发,而不是并行,或者你的主要目标是在同一个CPU上执行几个松耦合的任务,充分利用CPU的核,让其足够忙碌,从而最大化程序的吞吐量,那么你其实真正想做的是避免因为等待远程服务的返回,或者对数据库的查询,而阻塞线程的执行,浪费宝贵的计算资源,因为这种等待时间可能会很长。Future接口,尤其是它的新版实现CompletableFuture是处理这种情况的利器。

jdk13快来了,jdk8的这几点应该看看!

徘徊边缘 提交于 2019-11-29 05:42:49
说明 jdk8虽然出现很久了,但是可能我们还是有很多人并不太熟悉,本文主要就是介绍说明一些jdk8相关的内容。 主要会讲解: lambda表达式 方法引用 默认方法 Stream 用Optional取代null 新的日志和时间 CompletableFuture 去除了永久代(PermGen) 被元空间(Metaspace)代替 我们来看看阿里规范里面涉及到jdk8相关内容: [外链图片转存失败(img-KtCxHE6Z-1567558600313)(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==)] jdk8开篇 https://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html 主要有: 1:lambda表达式:一种新的语言特性,能够把函数作为方法的参数或将代码作为数据。lambda表达式使你在表示函数接口(具有单个方法的接口)的实例更加紧凑。 2:方法引用 是lambda表达式的一个简化写法,所引用的方法其实是lambda表达式的方法体实现,这样使代码更容易阅读 3:默认方法:Java 8引入default

CompletableFuture 详解

坚强是说给别人听的谎言 提交于 2019-11-26 21:14:49
Java CompletableFuture 详解 来源: http://colobu.com/2016/02/29/Java-CompletableFuture/# Java 8 强大的函数式异步编程辅助类 目录 [−] 主动完成计算 创建CompletableFuture对象。 计算结果完成时的处理 转换 纯消费(执行Action) 组合 Either 辅助方法 allOf 和 anyOf 更进一步 参考文档 Future 是Java 5添加的类,用来描述一个异步计算的结果。你可以使用 isDone 方法检查计算是否完成,或者使用 get 阻塞住调用线程,直到计算完成返回结果,你也可以使用 cancel 方法停止任务的执行。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 public class BasicFuture { public static void main(String[] args) throws ExecutionException, InterruptedException { ExecutorService es = Executors.newFixedThreadPool( 10); Future<Integer> f = es.submit(() ->{ // 长时间的异步计算 // …… // 然后返回结果 return 100;

CompletableFuture CompletableFuture.supplyAsync 异常处理

谁说我不能喝 提交于 2019-11-26 21:14:34
CompletableFuture 异常处理completeExceptionally可以把异常抛到主线程 /** * User: laizhenwei * Date: 2018-01-30 Time: 22:26 * Description: */ @RunWith(SpringRunner.class) //@SpringBootTest public class CompletableFutureTests { @Test public void testMethod() { String[] orders = {"1", "2", "3", "4", "5", "6"}; List<CompletableFuture<Boolean>> futures = new ArrayList<>(); Arrays.stream(orders).forEach(id -> { try{ futures.add(submitAsync(id)); }catch (Exception ex){ System.out.println(ex); } }); futures.stream().forEach(f-> { try { System.out.println(f.get()); } catch (Exception e) { e.printStackTrace(); } }); }

CompletableFuture

ⅰ亾dé卋堺 提交于 2019-11-26 21:14:22
  若你的意图是并发,而非并行,或者你的主要目标是在同一个CPU上执行几个松耦合的任务,充分利用CPU的核,让其足够忙碌,从而最大化程序的吞吐量,那么其实真正想做的避免因为等待远程服务的返回,或对数据库的查询而阻塞线程的执行,浪费计算资源。      Future接口在Java 5中引入,设计初衷是对将来某个时刻会发生的结果进行建模。它建模了一种异步计算,返回一个执行计算结果的引用。使用Future只需要将耗时的操作封装在一个Callable对象中,再将它提交给ExecutorService。可以调用get方法获取操作的结果。若操作已经完成,该方法会立刻返回操作的结果,否则它会阻塞你的线程,直到操作完成,返回响应的结果。Future还提供了一个参数设置超时时间,通过它可以定义线程等待Future结果的最长时间。   Future接口的局限:       将两个异步计算合并为一个——这两个异步计算之间相互独立,同时第二个又依赖于第一个的结果     等待Future集合中的所有任务都完成     仅等待Future集合中最快结束的任务完成     通过编程方式完成一个Future任务的执行     应对Future的完成事件      同步API和异步API     同步API是对传统方法调用的另一种称呼:你调用了某个方法,调用方在被调用方运行的过程中会等待,被调用方运行结束返回

completableFuture

独自空忆成欢 提交于 2019-11-26 21:14:13
completableFuture jian简化java异步开发 package org.coffee.mala.test; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.function.Supplier; import org.springframework.stereotype.Service; @Service public class BookAsyncService { public BookDetails getBookDetails(String bookId) throws InterruptedException, ExecutionException { Book book = getBook(bookId); CompletableFuture<ChuBanShe> chuBanShe = CompletableFuture.supplyAsync(new Supplier<ChuBanShe>() { @Override public ChuBanShe get() { return getChuBanShe(book.getChuBanSheId()); } });