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
相关产品推荐
相关产品推荐

