Java中创建线程传递初始化参数的核心思路是将参数封装进Runnable或Callable实现类中。1. 自定义Runnable类:通过构造方法接收并保存参数,在run()中使用;2. Lambda表达式:捕获“事实上final”的局部变量;3. 继承Thread类:不推荐,破坏组合优于继承原则;4. 线程池提交Callable任务:支持返回值与异常处理。

Java 中创建线程时传递初始化参数,核心思路是:**不直接在 new Thread() 里传参,而是把参数封装进 Runnable 或 Callable 的实现类中(通过构造方法或字段),再将该实例传给线程**。
用自定义 Runnable 类封装参数
这是最常用、最清晰的方式。定义一个实现 Runnable 的类,在其构造方法中接收并保存参数,run() 方法中使用这些参数:
- 定义类时声明私有字段存储参数(如 String name、int id)
- 提供带参构造方法,完成字段赋值
- 在 run() 中直接访问这些字段执行业务逻辑
示例:
class MyTask implements Runnable {private final String message;
private final int delay;
MyTask(String message, int delay) {
this.message = message;
this.delay = delay;
}
public void run() {
try {
Thread.sleep(delay);
System.out.println(message);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
// 启动线程
new Thread(new MyTask("Hello from thread!", 1000)).start();
用 Lambda 表达式 + 局部变量(适合简单场景)
Lambda 本身不能直接声明构造参数,但可以**捕获所在作用域的 final 或“事实上 final”的局部变量**,间接实现参数传递:
立即学习“Java免费学习笔记(深入)”;
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 在创建线程前定义好变量(如 String msg = "Hi"; int timeout = 500;)
- Lambda 体中直接使用这些变量
- 变量必须不可重新赋值(否则编译报错)
示例:
String msg = "Lambda says hello";int timeout = 300;
new Thread(() -> {
try {
Thread.sleep(timeout);
System.out.println(msg);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}).start();
用 Thread 子类方式(不推荐,但语法上可行)
继承 Thread 类,重写 run(),并在子类构造方法中接收参数:
- 子类构造器保存参数到成员变量
- run() 方法使用这些变量
- 注意:这种方式破坏了“组合优于继承”的原则,且一个类只能继承一个父类,灵活性低
示例:
class MyThread extends Thread {private final String taskName;
MyThread(String taskName) {
this.taskName = taskName;
}
public void run() {
System.out.println("Running: " + taskName);
}
}
new MyThread("Backup job").start();
向线程池提交带参任务(Callable + Future)
如果使用 ExecutorService,推荐用 Callable —— 它支持返回值和抛出异常,同样通过构造封装参数:
- 实现 Callable<T> 接口,构造方法接收参数
- call() 方法中使用参数并返回结果
- 用 submit() 提交,获得 Future 获取结果
示例:
class SumTask implements Callableprivate final int a, b;
SumTask(int a, int b) {
this.a = a;
this.b = b;
}
public Integer call() {
return a + b;
}
}
ExecutorService exec = Executors.newSingleThreadExecutor();
Future
System.out.println("Result: " + future.get()); // 输出 30

















