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