Java中如何实现类似JavaScript Async Await的顺序执行效果?
问题解答
核心误区澄清
你写的普通Java同步方法本身就是阻塞顺序执行的,main方法里的Class1()、Class2()、Class3()、Class4()本来就是执行完前一个才会执行后一个,不需要额外实现类似JavaScript的async await逻辑。你之前统计的耗时不准和执行顺序完全无关,是统计方式和JVM特性导致的。
耗时统计不准的原因
System.nanoTime()统计的是物理流逝时间(墙上时间),包含了线程调度、上下文切换、IO等待的时间,不是方法实际占用的CPU时间- 单次执行方法会包含JVM类加载、解释执行的额外开销,JIT即时编译还没生效,结果波动极大
- 你给出的示例统计代码里重复定义了
Start、End变量,同作用域下变量不能重复声明,本身也有语法错误
正确实现方案
1. 统计方法实际CPU耗时
使用ThreadMXBean获取当前线程的CPU耗时,排除非计算的等待时间,同时提前做预热消除JVM加载和编译的干扰:
import java.lang.management.ManagementFactory; import com.sun.management.ThreadMXBean; public class Main { private static final ThreadMXBean threadMXBean = (ThreadMXBean) ManagementFactory.getThreadMXBean(); // 注意修正原代码的语法错误:Class1()方法后多余的右括号、方法命名大小写统一 public static MaxSubSequence class1() { // 你的业务逻辑 } public static MaxSubSequence class2() { // 你的业务逻辑 } public static MaxSubSequence class3() { // 你的业务逻辑 } public static MaxSubSequence class4() { // 你的业务逻辑 } public static void main(String[] args) { // 预热:先循环执行多次方法,让JIT编译生效,排除类加载等一次性开销 for (int i = 0; i < 10000; i++) { class1(); class2(); class3(); class4(); } // 正式统计CPU耗时,单位为纳秒 long startCpu = threadMXBean.getCurrentThreadCpuTime(); class1(); long endCpu = threadMXBean.getCurrentThreadCpuTime(); System.out.println("class1 CPU耗时:" + (endCpu - startCpu) + "ns"); startCpu = threadMXBean.getCurrentThreadCpuTime(); class2(); endCpu = threadMXBean.getCurrentThreadCpuTime(); System.out.println("class2 CPU耗时:" + (endCpu - startCpu) + "ns"); startCpu = threadMXBean.getCurrentThreadCpuTime(); class3(); endCpu = threadMXBean.getCurrentThreadCpuTime(); System.out.println("class3 CPU耗时:" + (endCpu - startCpu) + "ns"); startCpu = threadMXBean.getCurrentThreadCpuTime(); class4(); endCpu = threadMXBean.getCurrentThreadCpuTime(); System.out.println("class4 CPU耗时:" + (endCpu - startCpu) + "ns"); } }
2. 专业级性能测试方案
如果需要更精准的性能对比结果,直接使用OpenJDK官方的JMH基准测试框架,可自动处理预热、多轮测试、结果拟合等逻辑,能避免手动写统计代码的各类系统误差。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

