转!!JAVA Future 模式与 Promise 模式

摘要:
importcom.google.common.util.concurrent.Future;importio.netty.util.concurrent.Future;importio.netty.util.concurrent.GenericFutureListener;inti=syncCalculate();
package com.test.demo.springboottest.asynTest;

import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.common.util.concurrent.MoreExecutors;
import io.netty.util.concurrent.DefaultEventExecutorGroup;
import io.netty.util.concurrent.EventExecutorGroup;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.GenericFutureListener;

import java.util.concurrent.Callable;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executors;

/**
 * @author wuyun
 * @Description: TODO
 * @date 2020/4/22
 * @Version 1.0
 */
public class FutureTest {

    public static void main(String[] args) {

        //同步调用模式
        /*
        try {
            long l = System.currentTimeMillis();
            int i = syncCalculate();
            System.out.println("计算结果:" + i);
            System.out.println("主线程运算耗时:" + (System.currentTimeMillis() - l) + "ms");
        } catch (Exception e) {
            e.printStackTrace();
        }
*/

        //Future 模式可以细分为将来式和回调式两种模式

        //1.Future 模式 – 将来式 1 (这种将来式的 future 适用多个耗时操作并发执行的场景。)
       /* try {
            long l = System.currentTimeMillis();
            EventExecutorGroup group = new DefaultEventExecutorGroup(4);
            Future<Integer> f = group.submit(new Callable<Integer>() {
                @Override
                public Integer call() throws Exception {
                    System.out.println("执行耗时操作...");
                    timeConsumingOperation();
                    return 100;
                }
            });
            // 其他耗时操作..
            System.out.println("计算结果::" + f.get());//等待结果,线程将会被这一步阻塞
            System.out.println("主线程运算耗时:" + (System.currentTimeMillis() - l) + "ms");
        } catch (Exception e) {
            e.printStackTrace();
        }*/


        //2.Future 模式 – 将来式 2---Netty框架
        //使用了 addListener 这样的方法为一个 future 结果添加回调,从而达到“当耗时操作完成后,自行触发钩子去执行打印操作”的效果。
        // 主线程只耗费了不到 1s 的时间,整个过程没有被耗时操作阻塞,这才是异步编程的推荐方式:回调。
        /*try {
            long l = System.currentTimeMillis();
            EventExecutorGroup group = new DefaultEventExecutorGroup(4);
            Future<Integer> f = group.submit(new Callable<Integer>() {
                @Override
                public Integer call() throws Exception {
                    System.out.println("执行耗时操作...");
                    timeConsumingOperation();
                    return 100;
                }
            });
            f.addListener(new GenericFutureListener<Future<? super Integer>>() {
                @Override
                public void operationComplete(Future<? super Integer> future) throws Exception {
                    System.out.println("计算结果::" + future.get());
                }
            });

            System.out.println("主线程运算耗时:" + (System.currentTimeMillis() - l) + "ms");
            new CountDownLatch(1).await();
        } catch (Exception e) {
            e.printStackTrace();
        }*/

        //guava-异步
        /*try {
            long l = System.currentTimeMillis();
            ListeningExecutorService service= MoreExecutors.listeningDecorator(Executors.newSingleThreadExecutor());
            ListenableFuture<Integer> future = service.submit(new Callable<Integer>() {
                public Integer call() throws Exception {
                    System.out.println("执行耗时操作...");
                    timeConsumingOperation();
                    return 100;
                }
            });//<1>
            Futures.addCallback(future, new FutureCallback<Integer>() {
                public void onSuccess(Integer result) {
                    System.out.println("计算结果:" + result);
                }
                public void onFailure(Throwable throwable) {
                    System.out.println("异步处理失败,e=" + throwable);
                }
            });//<2>
            System.out.println("主线程运算耗时:" + (System.currentTimeMillis() - l)+ "ms");
            new CountDownLatch(1).await();
        } catch (Exception e) {
            e.printStackTrace();
        }*/


        //由 Callback Hell 引出 Promise 模式
        //jdk1.8 已经提供了一种更为高级的回调方式:CompletableFuture
        /*try {
            long l = System.currentTimeMillis();
            CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(() -> {
                System.out.println("执行耗时操作...");
                timeConsumingOperation();
                return 100;
            });
            completableFuture.whenComplete((result, e) -> {
                System.out.println("结果:" + result);
            });
            System.out.println("主线程运算耗时:" + (System.currentTimeMillis() - l)+ "ms");
            new CountDownLatch(1).await();
        } catch (Exception e) {
            e.printStackTrace();
        }*/

        //回调嵌套:回调的回调
        try {
            long l = System.currentTimeMillis();
            CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(() -> {
                System.out.println("在回调中执行耗时操作...");
                timeConsumingOperation();
                return 100;
            });
            // 使用 thenCompose 或者 thenComposeAsync 等方法可以实现回调的回调
            completableFuture = completableFuture.thenCompose(i -> {
                return CompletableFuture.supplyAsync(() -> {
                    System.out.println("在回调的回调中执行耗时操作...");
                    timeConsumingOperation();
                    return i + 100;
                });
            });//<1>
            completableFuture.whenComplete((result, e) -> {
                System.out.println("计算结果:" + result);
            });
            System.out.println("主线程运算耗时:" + (System.currentTimeMillis() - l) + "ms");
            new CountDownLatch(1).await();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 最常用的同步调用
    static int syncCalculate() {
        System.out.println("执行耗时操作...");
        timeConsumingOperation();
        return 100;
    }
  //耗时操作
    static void timeConsumingOperation() {
        try {
            Thread.sleep(3000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

 原博文地址:https://www.cnkirito.moe/future-and-promise/

免责声明:文章转载自《转!!JAVA Future 模式与 Promise 模式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇关于抓取百度数据的问题sde用户下使用sqlplus登录错误ORA-12547: TNS:lost contact下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

java二维数组

1 二维数组的定义方式 二维数组的定义有很多方式 第一种方式: int[][] arr = new int[3][4]; 上面的代码相当于定义了一个3*4的二维数组,即二维数组的长度为3,二维数组中的每个元素又是一个长度为4的数组。 第二种方式: int[][] arr = new int[3][]; 第二种方式和第一种类似,只是数组中每个元素的长度不确定...

Java学习之基础语法篇

java 学习之路 0x00 前言 学习java也有段时间了,写篇文章来记录一下学习内容。 0x01 java加载机制 说到java不得不提的是java的类加载机制,java是一个依赖于jvm(也就是java的虚拟机)实现跨平台的一个开发语言,java所有的代码都会在jvm里面运行,java在运行中xx.java的源文件会被编译成class后缀文件(字节码...

【转】C# typeof()实例详解

转自:http://www.cnblogs.com/lm3515/archive/2010/09/02/1815725.html typeof(C# 参考) 用于获取类型的 System.Type 对象。typeof 表达式采用以下形式: System.Type type = typeof(int);  备注 若要获取表达式的运行时类型,可以使用...

instanceof 和 isInstance 强转 类型 class [MD]

博文地址 我的GitHub 我的博客 我的微信 我的邮箱 baiqiantao baiqiantao bqt20094 baiqiantao@sina.com 目录 目录 目录 简介 测试 继承关系 测试案例 基本测试 测试多态 测试null 测试数组 测试集合 测试基本类型 打印结果 简介 区别: instance...

Encrypt Decrypt

encryptstring                 DESCryptoServiceProvider desc = new DESCryptoServiceProvider();                byte[] key = System.Text.Encoding.Unicode.GetBytes(encryptkey);       ...

jdk1.8 对数组及arrays类对数组的操作与增强

数组的初始化有两种方式 静态初始化: 初始化时由程序员显示置顶每个数组的初始值,由系统决定数组长度。如: int[] a1 = new int[] {1,2,3,4}; 动态初始化:初始化时由程序员只指定数组长度,由系统为数组元素分配初始值。如: int[] a = new int[5];   写一个类测试一下 package chenlizhi;...