Future & Promise

在异步处理时,经常用到Future和Promise

netty 中的 Future 与 jdk 中的 Future 同名,但是是两个接口,netty 的 Future 继承自 jdk 的 Future,而 Promise 又对 netty Future 进行了扩展。

  • jdk Future 只能同步等待任务结束(或成功、或失败)才能得到结果
  • netty Future 可以同步等待任务结束得到结果,也可以异步方式得到结果,但都是要等任务结束
  • netty Promise 不仅有 netty Future 的功能,而且脱离了任务独立存在,只作为两个线程间传递结果的容器

功能/名称

jdk Future

netty Future

Promise

cancel

取消任务

-

-

isCanceled

任务是否取消

-

-

isDone

任务是否完成,不能区分成功失败

-

-

get

获取任务结果,阻塞等待

-

-

getNow

-

获取任务结果,非阻塞,还未产生结果时返回 null

-

await

-

等待任务结束,如果任务失败,不会抛异常,而是通过 isSuccess 判断

-

sync

-

等待任务结束,如果任务失败,抛出异常

-

isSuccess

-

判断任务是否成功

-

cause

-

获取失败信息,非阻塞,如果没有失败,返回null

-

addLinstener

-

添加回调,异步接收结果

-

setSuccess

-

-

设置成功结果

setFailure

-

-

设置失败结果

一、Future

public interface Future<V> extends java.util.concurrent.Future<V>

1、同步方式

        EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
        EventLoop eventLoop = eventLoopGroup.next();
        Future<Integer> future = eventLoop.submit(() -> {
            Thread.sleep(1000);
            return 50;
        });
        //主线程阻塞
        Integer integer = future.get();
        System.out.println(integer);

2、异步方式

EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
        EventLoop eventLoop = eventLoopGroup.next();
        Future<Integer> future = eventLoop.submit(() -> {
            Thread.sleep(1000);
            return 50;
        });
        future.addListener(new GenericFutureListener<Future<? super Integer>>() {
            @Override
            public void operationComplete(Future<? super Integer> future) throws Exception {
                //当前执行线程为eventLoop线程
                if(future.isSuccess()){
                    System.out.println(future.getNow());
                }
            }
        });

二、Promise

1、同步方式

        EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
        EventLoop eventLoop = eventLoopGroup.next();
        DefaultPromise<Integer> promise=new DefaultPromise<>(eventLoop);
        eventLoop.submit(() -> {
            try{
                Thread.sleep(1000);
                promise.setSuccess(50);
            }catch (Exception e){
                e.printStackTrace();
            }
        });
        //主线程阻塞
        System.out.println(promise.get());

2、异步方式

EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
        EventLoop eventLoop = eventLoopGroup.next();
        DefaultPromise<Integer> promise=new DefaultPromise<>(eventLoop);
        eventLoop.submit(() -> {
            try{
                Thread.sleep(1000);
                promise.setSuccess(50);
            }catch (Exception e){
                e.printStackTrace();
            }
        });

        promise.addListener(new GenericFutureListener<Future<? super Integer>>() {
            @Override
            public void operationComplete(Future<? super Integer> future) throws Exception {
                //当前执行线程为eventLoop线程
                if(future.isSuccess()){
                    System.out.println(future.getNow());
                }
            }
        });

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值