赞
踩
Zuul1.0 | Spring Cloud Gateway | Zuul2.0 | |
---|---|---|---|
长连接支持 | 不支持 | 支持 | 支持 |
IO模型 | 阻塞 | 非阻塞 | 非阻塞 |
性能 | 低 | 高 | 高 |
编程语言 | Java | Java | Java |
协议支持 | Http | Http | Http |
流量管理 | 需要二次开发 | 需要二次开发 | 需要二次开发 |
扩展性 | 低 | 高 | 中 |
成熟度 | 高 | 高 | 低 |
使用场景 | 中小型流量项目 | 大部分场景 | 大部分场景 |
Future
接口在某些方面存在一些局限性,这些局限性包括:
Future
的 get()
方法是阻塞的,这意味着如果任务的结果还没有准备好,调用 get()
方法的线程将会被阻塞,直到结果可用。这可能会导致应用程序的性能下降,特别是当需要同时处理多个 Future
对象时。Future
接口提供了 cancel()
方法来取消任务的执行,但是这个方法并不能真正地取消任务的执行。它只是尝试去取消任务,并返回一个表示取消成功与否的布尔值。如果任务已经开始执行或已经完成,那么 cancel()
方法将无效。Future
接口的 get()
方法会抛出 InterruptedException
和 ExecutionException
异常。然而,这些异常并不提供足够的信息来了解任务失败的原因。当任务抛出异常时,我们无法在 Future
对象上捕获和处理这些异常。Future
对象:在某些情况下,我们可能需要组合多个异步任务的结果,例如并行执行多个任务并将它们的结果合并。Future
接口本身并不提供直接的支持来处理这种情况,需要使用其他的方法,例如使用 CompletionService
或者 CompletableFuture
来实现。为了克服这些局限性,Java 8 引入了 CompletableFuture
类,它提供了更强大和灵活的功能,包括更好的异常处理、组合多个任务的结果以及异步任务的回调等。CompletableFuture
类提供了一种更现代和易于使用的方式来处理异步编程任务。
CompletableFuture
CompletableFuture是Java编程语言中的一个类,它在Java 8中引入作为CompletableFuture API的一部分。它属于java.util.concurrent包,并提供了一种执行异步编程和处理异步计算结果的方式。
CompletableFuture代表了一个可能在未来完成的计算,并允许你将多个操作链接在一起形成一个流水线。每个操作都是异步执行的,这意味着它可以与其他操作或任务并发运行。
以下是关于CompletableFuture的一些关键特性和概念:
thenCombine
方法指定一个函数,将两个CompletableFuture的结果合并并产生一个新的结果。exceptionally
方法指定一个备用值,或者使用 handle
方法处理异常并基于异常产生一个结果。package com.msb; import java.util.concurrent.*; public class FutureTaskTest { public static void main(String[] args) throws ExecutionException, InterruptedException { // 创建任务T2 FutureTask FutureTask<String> ft2 = new FutureTask<>(new T2Task()); // 创建任务T1的 FutureTask FutureTask<String> ft1 = new FutureTask<>(new T1Task(ft2)); // 线程1 执行T2任务 Thread t1 = new Thread(ft2); t1.start(); // 线程2执行 任务他 Thread t2 = new Thread(ft1); t2.start(); //等待返回结果 System.out.println(ft1.get()); } } // T1 任务 洗水壶,烧开水,泡茶 class T1Task implements Callable<String>{ FutureTask<String> ft2; public T1Task(FutureTask<String> ft2) { this.ft2 = ft2; } @Override public String call() throws Exception { System.out.println("T1 洗水壶。。。。。"); TimeUnit.SECONDS.sleep(1); System.out.println("T1 烧开水。。。。。"); TimeUnit.SECONDS.sleep(2); // 获取T2线程 String res = ft2.get(); System.out.println("T1 拿到茶叶。。。" + res); System.out.println("T1 泡茶。。。。。"); return "喝茶" + res; } } // T2任务 洗茶壶、洗茶杯、拿茶叶 class T2Task implements Callable<String>{ @Override public String call() throws Exception { System.out.println("T2 洗茶壶。。。。。"); TimeUnit.SECONDS.sleep(1); System.out.println("T2 洗茶杯。。。。。"); TimeUnit.SECONDS.sleep(2); System.out.println("T2 拿茶叶。。。。。"); TimeUnit.SECONDS.sleep(1); return "铁观音"; } }
package com.msb; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; public class CompletableFutureTest { public static void main(String[] args) { // 任务1: 洗水壶 -> 烧开水 CompletableFuture<Void> f1 = CompletableFuture.runAsync(() -> { System.out.println("T1 洗水壶。。。。。"); sleep(1,TimeUnit.SECONDS); System.out.println("T1 烧开水。。。。。"); sleep(2,TimeUnit.SECONDS); }); // 任务2: 洗茶壶 -> 洗茶杯 -> 拿茶叶 CompletableFuture<String> f2 = CompletableFuture.supplyAsync(() -> { System.out.println("T2 洗茶壶。。。。。"); sleep(1,TimeUnit.SECONDS); System.out.println("T2 洗茶杯。。。。。"); sleep(2,TimeUnit.SECONDS); System.out.println("T2 拿茶叶。。。。。"); sleep(1,TimeUnit.SECONDS); return "铁观音"; }); // 任务3: 任务1和任务2完成后执行:泡茶 CompletableFuture<String> f3 = f1.thenCombine(f2, (__, tf) -> { System.out.println("T1 拿到茶叶。。。。" + tf); System.out.println("T1 泡茶"); return "喝茶:" + tf; }); // 等待任务3的执行结果 System.out.println(f3.join()); } static void sleep(int t ,TimeUnit u){ try { u.sleep(t); } catch (InterruptedException e) { e.printStackTrace(); } } }
尽量使用内容作为缓存(Map、Queue) ,比如加载的配置
串行化使用场景
耗时较小,性能要求较高的场景
并行化使用场景
耗时较久,任务之间没有依赖关系,比如远程RPC调用场景
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。