贝利信息

在Java中Runnable接口如何创建线程_Java多线程入门解析

日期:2026-01-27 00:00 / 作者:P粉602998670
Runnable接口不创建线程,仅定义任务;真正创建并启动线程的是Thread类或线程池;直接调用run()无并发效果,须用start();匿名类、Lambda、独立类三种实现方式各适配不同场景。

Runnable接口本身不创建线程,它只定义任务

这是最常被误解的一点:Runnable 是一个函数式接口,只规定了 run() 方法签名,它不启动线程、不管理生命周期、也不持有线程资源。真正创建并启动线程的是 Thread 类或线程池。

常见错误现象:直接调用 myRunnable.run() —— 这只是普通方法调用,仍在当前线程执行,**完全不并发**。

三种主流写法及适用场景

实际开发中,Runnable 的实现方式影响可读性、复用性和维护成本。

匿名内

部类(适合一次性简单任务):

new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello from thread: " + Thread.currentThread().getName());
    }
}).start();

Lambda(Java 8+,推荐用于无状态逻辑):

new Thread(() -> {
    System.out.println("Hello from lambda thread");
}).start();

独立类实现(适合需复用、含状态或需测试的场景):

public class CounterTask implements Runnable {
    private final int count;
    public CounterTask(int count) { this.count = count; }
    @Override
    public void run() {
        for (int i = 0; i < count; i++) {
            System.out.println(Thread.currentThread().getName() + ": " + i);
        }
    }
}
// 使用
new Thread(new CounterTask(5)).start();

为什么不用继承 Thread 类而选 Runnable?

这不是风格偏好,而是 Java 语言机制和工程实践的硬约束。

容易忽略的线程安全陷阱

很多人以为只要用了 Runnable 就“多线程了”,却没意识到共享数据的风险。

线程真正的复杂点不在怎么启动,而在共享状态的可见性、原子性和有序性——这些靠 Runnable 接口本身解决不了,得靠 synchronizedvolatilejava.util.concurrent 工具类来兜底。