异步编程
所谓异步其实就是实现一个无需等待被调用函数的返回值而让操作继续运行的方法
(想自学习编程的小伙伴请搜索圈T社区,更多行业相关资讯更有行业相关免费视频教程。完全免费哦!)
创建任务并执行任务
无参创建
CompletableFuture<String> noArgsFuture = new CompletableFuture<>();
传入相应任务,无返回值
runAsync
方法可以在后台执行异步计算,但是此时并没有返回值。持有一个Runnable
对象。
CompletableFuture noReturn = CompletableFuture.runAsync(()->{
//执行逻辑,无返回值
});
传入相应任务,有返回值
此时我们看到返回的是CompletableFuture<T>
此处的T就是你想要的返回值的类型。其中的Supplier<T>
是一个简单的函数式接口。
CompletableFuture<String> hasReturn = CompletableFuture.supplyAsync(new Supplier<String>() {
@Override
public String get() {
return "hasReturn";
}
});
此时可以使用lambda
表达式使上面的逻辑更加清晰
CompletableFuture<String> hasReturnLambda = CompletableFuture.supplyAsync(TestFuture::get);
private static String get() {
return "hasReturnLambda";
}
获取返回值
异步任务也是有返回值的,当我们想要用到异步任务的返回值时,我们可以调用CompletableFuture
的get()
阻塞,直到有异步任务执行完有返回值才往下执行。
我们将上面的get()方法改造一下,使其停顿十秒时间。
private static String get() {
System.out.println("Begin Invoke getFuntureHasReturnLambda");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
}
System.out.println("End Invoke getFuntureHasReturnLambda");
return "hasReturnLambda";
}
然后进行调用
public static void main(String[] args) throws ExecutionException, InterruptedException {
CompletableFuture<String> funtureHasReturnLambda = (CompletableFuture<String>) getFuntureHasReturnLambda();
System.out.println("Main Method Is Invoking");
funtureHasReturnLambda.get();
System.out.println("Main Method End");
}
可以看到输出如下,只有调用get()
方法的时候才会阻塞当前线程。
Main Method Is Invoking
Begin Invoke getFuntureHasReturnLambda
End Invoke getFuntureHasReturnLambda
Main Method End
自定义返回值
除了等待异步任务返回值以外,我们也可以在任意时候调用complete()
方法来自定义返回值。
CompletableFuture<String> funtureHasReturnLambda = (CompletableFuture<String>) getFuntureHasReturnLambda();
System.out.println("Main Method Is Invoking");
new Thread(()->{
System.out.println("Thread Is Invoking ");
try {
Thread.sleep(1000);
funtureHasReturnLambda.complete("custome value");
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread End ");
}).run();
String value = funtureHasReturnLambda.get();
System.out.println("Main Method E