自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.all()的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Java异步编程框架Promise的介绍,对于理解java异步编程有哦帮助。
Promise的学习总结
promise.js 是 Promises 的轻量级 JavaScript 实现。 Promises 提供了 callback-passing 的替代方案,异步函数返回一个 Promise 对象可附加到 callbacks 中。 示例代码: function asyncfoo() { var p = new ...
个人学习交流博客:http://blog.csdn.net/sun_promise(我博客中的文章就有一部分是此笔记中总结的内容。) 本文档是基于毕向东老师的java基础视频和张孝祥老师的高薪技术视频和银行管理系统以及交通灯管理系统的...
java promise()是Promise A+规范的java实现版本。Promise A+是commonJs规范提出的一种异步编程解决方案,比传统的解决方案—回调函数和事件—更合理和更强大。promise实现了Promise A+规范,包装了java中对多线程...
该库是使用Java 8语法编写的。 让我们拥抱未来! :grinning_face_with_smiling_eyes: 要使用此到Java 7,6个5个项目,不要忘记安装由 。 用法 您可以这样创建Promiser 对象: Promiser< T> p = new Promiser< T> ...
这是一个Promise的简单实现,不含任何第三方插件。
这是我学习promise异步编程时,通过es6的promise行为模仿出来的promise实现,大致和es6的promise行为一致,具体可以我的这篇关于promise的文章:https://blog.csdn.net/qq_33024515/article/details/85121067
简单实现微信promise请求
算法基础:手动实现promiseAll
java8 看不到源码承诺 持续集成 快速介绍 Promise monad 的一个小型 java8 实现。 Promise 表示异步操作的结果。 考虑以下示例: Promise promise = Async.submit(() -> { String helloWorld = "hello world"; long ...
主要区别在于它使用netty的promise实现。 它使JPromise能够选择将在其中执行回调的线程。 它仅支持JAVA8。我喜欢lambda表达式。 要求 JAVA 8 净值 玛文 尚不支持。 您必须自己构建工件。 下载资源 使用mvn构建...
Promise在ie8等不支持Promise的浏览器上的完整实现
Promise的基本实现和使用讲解
采用Symbol和process.nextTick实现Promise
Promise Async+await实现原理及案例分析
像Promise.all()一样简单,但连续
基于 promise 的进程池实现
里面主要是手写的promise实现过程,以及promise的详解笔记,对于初接触promise和进阶的前端人员来说是相当值得一看的