You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 10:00:05