java - 我在 Java 中使用什么将等同于 Javascript 中的 Async Await?
问题描述
public class main {
private static class myClass {
...
}
public static MaxSubSequence Class1()) {
...
}
public static MaxSubSequence Class2() {
...
}
public static MaxSubSequence class3() {
...
}
public static MaxSubSequence class4() {
...
}
public static void main(String[] args) {
Class1();
Class2();
Class3();
Class4();
}
}
在上面的示例代码中,我试图计算 main 中每个函数调用的 CPU 时间。如果我做:
long Start= System. nanoTime();
Class1();
long End= System.nanoTime();
long CPUTime=End-Start;
long Start= System. nanoTime();
Class2();
long End= System.nanoTime();
long CPUTime=End-Start;
long Start= System. nanoTime();
Class3();
long End= System.nanoTime();
long CPUTime=End-Start;
long Start= System. nanoTime();
Class4();
long End= System.nanoTime();
long CPUTime=End-Start;*
那么CPU时间就会出错。我想先完成执行,然后再Class1()
像Class2()
Javascript一样,但我不知道该怎么做。有人可以帮我吗?Class3()
Class4()
Async Await
解决方案
您可以在可完成的未来中调用方法的执行并将它们链接在一起。如果我理解正确,这就是我尝试做的方式。
Completable:join
阻塞直到执行完成。
public class SimpleCompletableFutureSequence {
static class MyClass {
public String execute(String arg) {
// this will be otherwise lengthy operation
return arg;
}
public CalculatedTimedResponse executeAnother(String arg) {
LocalTime startTime = LocalTime.now();
LocalTime endTime = LocalTime.now();
MyClass myClass = new MyClass();
String response = null;
try {
response = myClass.execute(arg);
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
endTime = LocalTime.now();
}
Duration timeDifference = Duration.between(startTime, endTime);
System.out.println("Difference: " + timeDifference.toSecondsPart());
return new CalculatedTimedResponse(timeDifference.toSecondsPart(), response);
}
}
static CompletableFuture<String> class1() {
return CompletableFuture.completedFuture(new MyClass().execute("class1"));
}
static CompletableFuture<String> class2() {
return CompletableFuture.completedFuture(new MyClass().execute("class2"));
}
static CompletableFuture<String> class3() {
return CompletableFuture.completedFuture(new MyClass().execute("class3"));
}
static CompletableFuture<String> class4() {
return CompletableFuture.completedFuture(new MyClass().execute("class4"));
}
public static void main(String[] args) {
List<CompletableFuture<String>> allFutures = Arrays.asList(class1(), class2(), class3(), class4());
List<String> allResponse = allFutures.stream().map(CompletableFuture::join).collect(Collectors.toList());
System.out.println(allResponse);
}
}
如果您打算计算时差,那么我尝试这样做:
static class CalculatedTimedResponse {
int difference;
String response;
public CalculatedTimedResponse(int difference, String response) {
this.difference = difference;
this.response = response;
}
@Override
public String toString() {
return "CalculatedTimedResponse{" +
"difference=" + difference +
", response='" + response + '\'' +
'}';
}
}
和 2 个可完成的期货
static CompletableFuture<CalculatedTimedResponse> class1Response = CompletableFuture.supplyAsync(new Supplier<CalculatedTimedResponse>() {
@Override
public CalculatedTimedResponse get() {
return new MyClass().executeAnother("time-execute- 1");
}
});
static CompletableFuture<CalculatedTimedResponse> class2Response = CompletableFuture.supplyAsync(new Supplier<CalculatedTimedResponse>() {
@Override
public CalculatedTimedResponse get() {
return new MyClass().executeAnother("time-execute- 2");
}
});
List<CompletableFuture<CalculatedTimedResponse>> timedFutures = Arrays.asList(class1Response, class2Response);
List<CalculatedTimedResponse> allTimeResponse = timedFutures.stream().map(CompletableFuture::join).collect(Collectors.toList());
System.out.println(allTimeResponse);
推荐阅读
- css - 使用spring security和thymeleaf时无法加载我的css
- ios - 使用 HealthKit 结果填充 TableView - Swift
- javascript - 需要指导将 excel 修改为 JSON javascript 代码以每组数据输出一个 JSON
- sublimetext3 - 未注册的崇高文本
- java - 如何使用鼠标滚轮增加圆周内的圆的大小?
- android - 为 Android 编译 Unreal Engine AR 蓝牙模板时出现“致命错误:找不到‘initializer_list’文件”
- vb.net - 使用 Visual Basic 在条形菜单上添加 Itens 时出现问题
- sql - 如何为其他列中的每个值选择具有 5 个不同值的行?
- c++ - 在模板中使用与模板类相同类型的类型别名它自己
- html - 循环单词动画子项的对齐问题