Java CompletableFuture的complete(7)
Java CompletableFuture的complete(7)
先看代码:
CompletableFuture<String> future = CompletableFuture.supplyAsync(new Supplier<String>() { @Override public String get() { try { TimeUnit.SECONDS.sleep(2); } catch (Exception e) { e.printStackTrace(); } return "blog.csdn.net/zhangphil"; } }); System.out.println(System.currentTimeMillis() + ":time 1"); future.whenCompleteAsync(new BiConsumer<String, Throwable>() { @Override public void accept(String s, Throwable throwable) { System.out.println(System.currentTimeMillis() + ":" + s); } }); System.out.println(System.currentTimeMillis() + ":time 2"); new Thread(new Runnable() { @Override public void run() { try { TimeUnit.SECONDS.sleep(3); } catch (Exception e) { //异常退出。 future.completeExceptionally(e); } // CompletableFuture被通知线程任务完成。 System.out.println(System.currentTimeMillis() + ":运行至此。"); future.complete("任务完成。"); } }).start(); System.out.println(System.currentTimeMillis() + ":time 3");
输出:
06-19 11:25:17.630 15068-15068/zhangphil.test I/System.out: 1529378717630:time 1 06-19 11:25:17.631 15068-15068/zhangphil.test I/System.out: 1529378717631:time 2 1529378717631:time 3 06-19 11:25:19.638 15068-15094/zhangphil.test I/System.out: 1529378719638:blog.csdn.net/zhangphil 06-19 11:25:20.634 15068-15095/zhangphil.test I/System.out: 1529378720633:运行至此。
可以看到在Thread线程体中的
future.complete("任务完成。");
没有执行,是因为在CompletableFuture.supplyAsync只休息了两秒,就正常执行完毕了,故不再执行complete的代码了。complete用来告知CompletableFuture任务完成。
下面调换sleep时间,让CompletableFuture.supplyAsync休息的长一些,而Thread里面休息短一下:
CompletableFuture<String> future = CompletableFuture.supplyAsync(new Supplier<String>() { @Override public String get() { try { TimeUnit.SECONDS.sleep(3); } catch (Exception e) { e.printStackTrace(); } return "blog.csdn.net/zhangphil"; } }); System.out.println(System.currentTimeMillis() + ":time 1"); future.whenCompleteAsync(new BiConsumer<String, Throwable>() { @Override public void accept(String s, Throwable throwable) { System.out.println(System.currentTimeMillis() + ":" + s); } }); System.out.println(System.currentTimeMillis() + ":time 2"); new Thread(new Runnable() { @Override public void run() { try { TimeUnit.SECONDS.sleep(2); } catch (Exception e) { //异常退出。 future.completeExceptionally(e); } // CompletableFuture被通知线程任务完成。 System.out.println(System.currentTimeMillis() + ":运行至此。"); future.complete("任务完成。"); } }).start(); System.out.println(System.currentTimeMillis() + ":time 3");
输出:
06-19 11:32:26.814 16768-16768/zhangphil.test I/System.out: 1529379146814:time 1 06-19 11:32:26.815 16768-16768/zhangphil.test I/System.out: 1529379146815:time 2 06-19 11:32:26.816 16768-16768/zhangphil.test I/System.out: 1529379146816:time 3 06-19 11:32:28.818 16768-16820/zhangphil.test I/System.out: 1529379148818:运行至此。 06-19 11:32:28.822 16768-16854/zhangphil.test I/System.out: 1529379148822:任务完成。
这次没有输出字符串blog.csdn.net/zhangphil了,因为Thread率先执行完成,则直接以complete的结果为准,忽略CompletableFuture.supplyAsync的get计算结果。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
go容易遇到的语言的小坑
在写go的时候, 经常会有这样的情况 a, err := x() b, err := y() 虽然第二行是使用:=, 但是还是和第一行的err是一个值但是当下面这种情况 a, err := x() if true { b, err := y() } 就不是一个值了, 因为有了{}这个作用域 总结就是=都用旧值, :=的之后至少有一个新值, 其他能用新就用新 以前结果都是我通过实验猜出来的, 就是这样了
- 下一篇
Html网页标签曝光埋点
移动开发过程中经常要用埋点来促进产品的改进,在native端做埋点相对来说简单一点,比如曝光,在view的类中可以使用显示回调来做,但在网页中要如何做埋点呢,比如要知道一个div标签的曝光次数应该怎么做,类比客户端自然是想知道有没有类似显示的回调,很不幸,Html里没有这个事件回调,但onload是有的,要实现曝光埋点,需要自己实现曝光事件的检测.以下是实现思路: 曝光,即是标签从浏览器中不可见到可见区域内时触发,关键就是要检测标签当前的位置还有当前可见区域的位置.如果这标签的所表示的区域矩形和可见区域相交,则可以认为标签被看到.那么就要分别计算标签区域大小和坐标和可见区域大小和坐标. 可见区域坐标和大小可以使用window对象获取scrollTop,scrollLeft和clientWidth,clientHeight来得到.标签的大小可以通过getElementById来获取到div对象然后得到相应属性.为了效率,我们可以先在body加载完后先获得好标签的大小和位置,然后在窗口的滚动时实时计算可见区域,并且计算可见区域是否和各个标签区域相交由此得到标签是否可见,以下是代码: <...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装Nodejs环境
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS关闭SELinux安全模块
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16