异步回调机制(Netty 学习七)

FutureTask,基础异步回调框架

Runnable接口的run方法是无返回值的,为了获取线程运行的返回值,java引入了Callable接口,用来弥补这个缺憾。
代码实例:

		FutureTask<Boolean> futureTask = new FutureTask(new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                return 1;
            }
        });
        Thread t = new Thread(futureTask);
        t.start();
        Integer b = f.get();

涉及的类图如下:

«interface» Future get() «interface» Runnable run() «interface» RunnableFuture run() «interface» Callable call() «interface» FutureTask run() get() «class» Thread start() implements

FutureTask的get方法类型与Thread的join方法类似,会阻塞主线程等待返回结果。换句话说这并不是异步回调。之所以介绍FutureTask,是因为它是异步回调的基础。

Guava:Google的扩展实现

为了实现异步回调,Google对Callable,Future 以及FutureTask 做个进一步的封装,增加对执行后结果的监听机制,以此实现异步回调效果(主线程可以不阻塞,执行其他操作,通过监听机制触发后续操作)。代码示例如下:

        //初始化Callable
        Callable<Integer> callable = new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                Thread.sleep(1000);
                return 3;
            }
        };
		//第一种实现方式,通过ListenableFuture和FutureCallback实现。
        //初始化线程池
        ExecutorService pool = Executors.newFixedThreadPool(10);
        ListeningExecutorService lPool = MoreExecutors.listeningDecorator(pool);
        //获取Future
        ListenableFuture<Integer> l = lPool.submit(callable);
        //为Future添加监听
        Futures.addCallback(l, new FutureCallback<Integer>() {
            @Override
            public void onSuccess(@Nullable Integer integer) {
                if(integer == 3){
                    System.out.println("haha");
                }
            }

            @Override
            public void onFailure(Throwable throwable) {
                System.out.println("wanle");
            }
        });

		//第二种方式,通过ListenableFutureTask实现
        //获取可监听的FutureTask
        ListenableFutureTask<Integer> futureTask = ListenableFutureTask.create(callable);
        //添加监听
        futureTask.addListener(new Runnable() {
            @Override
            public void run() {
                System.out.println("laiyige");
            }
        },lPool);
        //启动线程
        new Thread(futureTask).start();

第一种方式引入了一个新的接口FutureCallback,根据业务代码的执行结果(成功,失败)执行对应的处理逻辑。第二种方式是对FutureTask的扩展,增加监听线程,在业务代码执行结束后启动监听的线程,执行后续处理逻辑。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值