java中通过实现runnable接口创建线程需重写无参无返回值且不抛受检异常的run()方法,将其实例传入thread构造器后调用start()启动;可使用lambda简化、注意共享变量线程安全。

Java 中通过实现 Runnable 接口创建线程,核心是重写 run() 方法,并将该对象传给 Thread 构造器启动。
定义一个类实现 Runnable 接口
必须实现 run() 方法,这个方法里写线程要执行的逻辑。注意:它没有返回值、不能抛出受检异常、也不能接收参数。
- 示例代码:
public class MyTask implements Runnable {
@Override
public void run() {
System.out.println("线程正在运行:" + Thread.currentThread().getName());
// 这里放你的任务逻辑,比如循环、计算、IO 等
}
}
创建 Thread 对象并启动线程
把实现了 Runnable 的实例传给 Thread 构造方法,再调用 start() 启动——不是直接调用 run()。
- 错误做法:
task.run()→ 只是在当前线程执行,没真正启新线程 - 正确做法:
new Thread(task).start() - 可选:给线程命名,便于调试
public class Main {
public static void main(String[] args) {
Runnable task = new MyTask();
Thread thread = new Thread(task, "MyWorkerThread");
thread.start(); // ✅ 启动新线程
}
}
使用匿名内部类或 Lambda 表达式(更简洁)
如果任务简单,不需要复用 Runnable 实现类,可以直接用 Lambda,前提是接口只有一个抽象方法(Runnable 符合)。
- Lambda 写法(JDK 8+):
new Thread(() -> {
System.out.println("Hello from lambda thread!");
}).start();
- 等价于匿名内部类写法:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello from anonymous class!");
}
}).start();
注意共享变量与线程安全
多个线程操作同一变量时,可能引发数据不一致问题。Runnable 实例常被多个线程共用(比如线程池中),所以尽量避免在 Runnable 中维护可变状态。
- 推荐:把任务所需数据作为构造参数传入,保持 Runnable 实例无状态
- 如需修改共享数据,加同步机制(synchronized、Lock、原子类等)
public class CounterTask implements Runnable {
private final int count; // 不可变,线程安全
public CounterTask(int count) {
this.count = count;
}
@Override
public void run() {
System.out.println("Count: " + count);
}
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











