在Java中,使用Runnable接口创建线程是一种灵活且常用的多线程实现方式,它避免了直接继承Thread类带来的单继承限制,更适合需要复用代码或者实现多接口的场景。这种方式的核心是将线程要执行的任务逻辑和线程本身的生命周期管理分离,让代码结构更加清晰。

Runnable接口的基本定义
Runnable是Java标准库中的一个函数式接口,位于java.lang包下,它的定义非常简单,只包含一个无参数无返回值的run方法,源码结构如下:
// Runnable接口源码定义
@FunctionalInterface
public interface Runnable {
// 线程执行的核心逻辑方法,需要由实现类重写
public abstract void run();
}
我们只需要实现这个接口,重写run方法,把线程需要执行的任务代码写在run方法中即可。
使用Runnable接口创建线程的步骤
步骤一:定义Runnable接口的实现类
首先需要创建一个类实现Runnable接口,并重写run方法,在run方法中编写线程要执行的具体业务逻辑。如果是Java 8及以上版本,也可以使用lambda表达式来简化实现,不需要单独定义实现类。
步骤二:创建实现类的实例
实例化刚才定义的Runnable实现类,得到任务对象。
步骤三:将任务对象传入Thread构造器
Thread类提供了接收Runnable类型参数的构造方法,我们把任务对象作为参数传入,创建Thread实例,这个Thread实例就关联了我们要执行的任务。
步骤四:调用Thread的start方法启动线程
注意不能直接调用Runnable的run方法,那样只是在当前线程中执行普通方法,不会启动新线程,必须调用Thread实例的start方法,才会真正创建新的线程并执行run方法中的逻辑。
完整代码示例
下面给出一个完整的示例,分别展示使用实现类方式和lambda方式创建线程的写法:
public class RunnableThreadDemo {
public static void main(String[] args) {
// 方式一:使用自定义实现类
// 定义Runnable实现类
class MyRunnable implements Runnable {
@Override
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println("自定义实现类线程执行:" + i);
try {
// 让线程休眠100毫秒,方便观察执行顺序
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
// 创建Runnable实例
MyRunnable myRunnable = new MyRunnable();
// 创建Thread对象并传入任务
Thread thread1 = new Thread(myRunnable);
// 启动线程
thread1.start();
// 方式二:使用lambda表达式(Java 8+)
Thread thread2 = new Thread(() -> {
for (int i = 0; i < 3; i++) {
System.out.println("lambda方式线程执行:" + i);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
// 启动线程
thread2.start();
// 主线程的逻辑
for (int i = 0; i < 3; i++) {
System.out.println("主线程执行:" + i);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
运行上面的代码,你会看到三个线程(两个子线程加主线程)的执行输出是交替的,说明新线程确实被成功启动并和主线程并发执行。
Runnable方式和继承Thread方式的区别
很多开发者会疑惑两种方式该怎么选,下面通过表格对比两者的核心差异:
| 对比维度 | 实现Runnable接口 | 继承Thread类 |
|---|---|---|
| 继承限制 | 没有单继承限制,还可以实现其他接口 | 受单继承限制,不能再继承其他类 |
| 任务分离 | 任务和线程生命周期分离,更符合面向对象设计 | 任务和线程耦合在一起 |
| 资源共享 | 同一个Runnable实例可以传给多个Thread,方便共享资源 | 需要静态变量才能实现资源共享,不够灵活 |
| 使用复杂度 | 步骤稍多,但Java 8后lambda可简化 | 步骤简单,直接重写run方法即可 |
注意事项
- 不要直接调用Runnable的run方法,只有调用Thread的start方法才会启动新线程,直接调用run方法只是在当前线程执行普通方法。
- 同一个Runnable实例可以传给多个Thread对象,多个线程会共享同一个Runnable实例的成员变量,如果需要线程隔离,要注意变量的作用域。
- run方法不能抛出受检异常,如果有需要处理的异常,必须在run方法内部用try-catch捕获,不能声明在方法上抛出。
- 线程的启动顺序不代表执行顺序,线程的执行由操作系统调度决定,每次运行的输出顺序可能不同。
总结来说,在Java中使用Runnable接口创建线程的步骤很清晰,先实现run方法定义任务,再把任务传给Thread对象启动即可。这种方式扩展性更好,是实际开发中的推荐选择,尤其是在需要线程共享资源或者避免单继承限制的场景下。
JavaRunnable接口线程创建多线程run方法修改时间:2026-06-30 01:48:41