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条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- CentOS8安装Docker,最新的服务器搭配容器使用
- Hadoop3单机部署,实现最简伪集群
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- MySQL8.0.19开启GTID主从同步CentOS8
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Mario游戏-低调大师作品
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程