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

Java如何通过lambda表达式向Thread线程方法传递参数

关于lambda实现线程的写法正确性

你写的Thread myThread = new Thread(() -> myMethod(a, b));是完全合法的Java 8+语法。
这种写法本质是用lambda表达式实现了Runnable接口的run()方法,要求你代码里的a、b两个变量是*实际不可变(effectively final)*的——也就是在lambda定义之后不会再被修改,否则编译阶段就会报错。
如果你的myMethod是无参数方法,还可以用更简洁的方法引用写法:

// 无参方法可以直接替换lambda
Thread myThread = new Thread(this::myMethod);

关于MXBean获取threadCPUTime返回-1的问题

这和你的lambda写法无关,通常是以下3种原因导致:

  • 线程未启动:你只实例化了Thread对象,没有调用start()方法启动线程,此时线程处于NEW状态,从未被CPU调度执行,自然没有CPU时间统计。
  • 线程已终止:线程执行完成进入TERMINATED状态后,部分JVM实现会对已销毁的线程返回-1。
  • 未开启CPU时间统计:部分JVM默认关闭线程CPU时间统计功能,需要手动开启。

正确实现示例

import java.lang.management.ManagementFactory;
import java.lang.management.ThreadMXBean;

public class LambdaThreadDemo {
    // 自定义带参方法
    public void myMethod(int a, String b) {
        // 模拟业务逻辑执行
        for (int i = 0; i < 10000; i++) {
            Math.random();
        }
        System.out.printf("方法执行完成,参数a:%d,参数b:%s%n", a, b);
    }

    public static void main(String[] args) throws InterruptedException {
        LambdaThreadDemo demo = new LambdaThreadDemo();
        // 定义要传入的参数,必须是实际不可变
        final int paramA = 20;
        final String paramB = "自定义参数";

        // 用lambda包装带参方法创建线程
        Thread myThread = new Thread(() -> demo.myMethod(paramA, paramB));

        // 启动线程
        myThread.start();

        // 开启CPU时间统计
        ThreadMXBean threadMxBean = ManagementFactory.getThreadMXBean();
        if (threadMxBean.isThreadCpuTimeSupported()) {
            threadMxBean.setThreadCpuTimeEnabled(true);
            // 等待线程执行完成再查询CPU时间
            myThread.join();
            long cpuTimeNs = threadMxBean.getThreadCpuTime(myThread.getId());
            System.out.printf("线程CPU执行时间:%d ns%n", cpuTimeNs);
        } else {
            System.out.println("当前JVM不支持线程CPU时间统计");
        }
    }
}

内容的提问来源于stack exchange,提问作者Ymi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 03:42:02