`
rainsilence
  • 浏览: 160476 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

用Java实现Promise的难点总结

阅读更多

自Promise被纳入ECMAScript6标准后,各大浏览器几乎都实现了Promise标准。

以下是ecmascript6里promise的典型用法,为了解决一个线程的任务完成后,再去执行另一个任务。

var promise = new Promise(function(resolve, reject) {
      $.ajax({
           success: function() {
                 resolve();
           },
           failure: function() {
                 reject();
           }
      })
});

promise.then(function() {
       //调用了resolve或者reject之后
});

 

Java实现Promise相比较ECMAScript6来说,有些不同。

Javascript不管怎么样都是单线程的,即使ajax在浏览器内核层面表现出多线程,但是执行到js端还是单线程的。而在java上实现promise机制则复杂的多。具体表现在:

1)即使在上一个线程执行任务后,下一个任务可以在同一个线程中执行,但是加入任务的操作不得不是同步的

Netty4源码:io.netty.util.concurrent.DefaultPromise

    @Override
    public Promise<V> addListener(GenericFutureListener<? extends Future<? super V>> listener) {
        if (listener == null) {
            throw new NullPointerException("listener");
        }

        if (isDone()) {
            notifyLateListener(listener);
            return this;
        }
        //加入时必须同步
        synchronized (this) {
            if (!isDone()) {
                if (listeners == null) {
                    listeners = listener;
                } else {
                    if (listeners instanceof DefaultFutureListeners) {
                        ((DefaultFutureListeners) listeners).add(listener);
                    } else {
                        final GenericFutureListener<? extends Future<V>> firstListener =
                                (GenericFutureListener<? extends Future<V>>) listeners;
                        listeners = new DefaultFutureListeners(firstListener, listener);
                    }
                }
                return this;
            }
        }

        notifyLateListener(listener);
        return this;
    }

 

2)在多个平行任务(线程)结束后,再去执行一个任务的case (Promise.all)的时候,判断任务是否结束的计数操作也不得不是同步的。

Netty源码:io.netty.channel.group.DefaultChannelGroupFuture

    private final ChannelFutureListener childListener = new ChannelFutureListener() {
        @Override
        public void operationComplete(ChannelFuture future) throws Exception {
            boolean success = future.isSuccess();
            boolean callSetDone;
            // 判断所有的task是否已经结束也必须同步
            synchronized (DefaultChannelGroupFuture.this) {
                if (success) {
                    successCount ++;
                } else {
                    failureCount ++;
                }

                callSetDone = successCount + failureCount == futures.size();
                assert successCount + failureCount <= futures.size();
            }

            if (callSetDone) {
                if (failureCount > 0) {
                    List<Map.Entry<Channel, Throwable>> failed =
                            new ArrayList<Map.Entry<Channel, Throwable>>(failureCount);
                    for (ChannelFuture f: futures.values()) {
                        if (!f.isSuccess()) {
                            failed.add(new DefaultEntry<Channel, Throwable>(f.channel(), f.cause()));
                        }
                    }
                    setFailure0(new ChannelGroupException(failed));
                } else {
                    setSuccess0();
                }
            }
        }
    };

 

分享到:
评论

相关推荐

    Java异步编程框架之Promise介绍

    异步模式的场景包括但不限于网络IO操作,例如使用Java NIO框架Netty,以及基于Reactor模式的响应式编程。在这些场景下,异步API可以有效避免线程阻塞,提高系统的吞吐量。例如,对于磁盘IO,Java NIO2提供了异步API...

    Java实现Promise.all()的示例代码

    Java实现Promise.all()示例代码详解 在Java中实现Promise.all()的示例代码,提供了一个使用CountDownLatch和ThreadPoolExecutor来实现并发执行异步请求的解决方案。下面将详细介绍这个示例代码的实现思路和知识点。...

    promise的学习总结

    Promise的学习总结

    Promises的JavaScript实现promisejs.zip

    promise.js 是 Promises 的轻量级 JavaScript 实现。 Promises 提供了 callback-passing 的替代方案,异步函数返回一个 Promise 对象可附加到 callbacks 中。 示例代码: function asyncfoo() { var p = new ...

    Promise在ie8等不支持Promise的浏览器上的完整实现

    这样的实现不仅允许开发者在旧版本的浏览器中使用Promise,还可以帮助他们更好地理解和掌握Promise的工作原理。在实际项目中,可以考虑使用polyfill库,如es6-promise,它们已经提供了完善的Promise兼容性解决方案。

    java 回调函数 实现

    总结,回调函数是Java中实现事件监听和异步处理的关键技术,通过接口定义回调方法,可以在适当的时候调用这些方法来执行相应的操作。在给定的示例中,`Button.java`和`OnButtonClickListener.java`展示了如何通过...

    Promise的简单实现

    在提供的标题"Promise的简单实现"中,我们可以理解为我们将讨论如何从零开始创建一个基础版本的Promise。这个实现可能不包含完整的API,但会涵盖Promise的核心概念和基本工作原理。 描述提到这是一个不含任何第三方...

    手把手教你实现 Promise的使用方法

    本文将带你了解如何实现Promise的原理以及如何正确使用Promise。 首先,Promise有三种状态:pending(等待中)、fulfilled(已成功)、rejected(已失败)。状态一旦改变,就不会再变。在创建一个新的Promise时,...

    promise:Promise-在Java中以同步的方式异步编程

    java promise()是Promise A+规范的java实现版本。Promise A+是commonJs规范提出的一种异步编程解决方案,比传统的解决方案—回调函数和事件—更合理和更强大。promise实现了Promise A+规范,包装了java中对多线程...

    promiser-java:Java中Promise的轻量级实现

    该库是使用Java 8语法编写的。 让我们拥抱未来! :grinning_face_with_smiling_eyes: 要使用此到Java 7,6个5个项目,不要忘记安装由 。 用法 您可以这样创建Promiser 对象: Promiser&lt; T&gt; p = new Promiser&lt; T&gt; ...

    像Promiseall一样简单但连续

    在JavaScript中,我们可以使用递归、async/await语法,或者自定义Promise方法来实现这种连续的Promise执行。例如: ```javascript function sequence(promises) { return promises.reduce((prevPromise, ...

    自己模仿es6的Promise行为实现的Promise

    这是我学习promise异步编程时,通过es6的promise行为模仿出来的promise实现,大致和es6的promise行为一致,具体可以我的这篇关于promise的文章:https://blog.csdn.net/qq_33024515/article/details/85121067

    promise详解,手动实现以及上万字笔记.rar

    本资源包含了一份手动实现Promise的源码(Promise.js)和一份详细的Promise详解笔记(文档.md)。以下是Promise的基础知识及深入解析: 1. **Promise状态**: - `pending`:初始状态,既没有完成也没有被拒绝。 -...

    简单实现微信promise请求

    简单实现微信promise请求

    java基础学习总结笔记

    个人学习交流博客:http://blog.csdn.net/sun_promise(我博客中的文章就有一部分是此笔记中总结的内容。) 本文档是基于毕向东老师的java基础视频和张孝祥老师的高薪技术视频和银行管理系统以及交通灯管理系统的...

    算法基础:手动实现promiseAll

    算法基础:手动实现promiseAll

    Promise的基本实现和使用讲解

    Promise的基本概念、实现以及使用方法是每个JavaScript开发者必须掌握的关键知识点。 Promise对象有三种状态:pending(等待中)、fulfilled(已完成)和rejected(已拒绝)。Promise从pending开始,可以变为...

    使用ES6Promise实现的一个无限状态机

    这个"使用ES6 Promise实现的一个无限状态机"是一个创新的方法,它将Promise的异步处理能力与状态机的概念结合,使得状态变化和异步操作能够更加优雅地进行管理。 首先,我们要理解ES6 Promise。Promise是JavaScript...

    java8看不到源码-promises:Promisemonad的一个小型java8实现。Promise表示异步操作的结果

    java8 看不到源码承诺 持续集成 快速介绍 Promise monad 的一个小型 java8 实现。 Promise 表示异步操作的结果。 考虑以下示例: Promise promise = Async.submit(() -&gt; { String helloWorld = "hello world"; long ...

    jpromise:使用netty实现node.js的Promise的Java实现

    主要区别在于它使用netty的promise实现。 它使JPromise能够选择将在其中执行回调的线程。 它仅支持JAVA8。我喜欢lambda表达式。 要求 JAVA 8 净值 玛文 尚不支持。 您必须自己构建工件。 下载资源 使用mvn构建...

Global site tag (gtag.js) - Google Analytics