Java中Runnable接口实现多线程的核心是分离任务逻辑与线程执行,需实现run()方法定义任务,再传入Thread构造器并调用start()启动新线程,不可直接调用run()。

Java 中使用 Runnable 接口实现多线程任务,核心是把“做什么”(任务逻辑)和“谁来做”(线程执行)分开。它不直接创建线程类,而是定义一个可执行的任务单元,再交给 Thread 去运行。
定义任务:实现 run() 方法
Runnable 是一个函数式接口,只含一个抽象方法 run()。你需要提供它的具体实现——也就是线程真正要执行的代码。
- 可以写一个普通类实现 Runnable 接口,重写 run() 方法
- 也可以用 Lambda 表达式,更简洁,尤其适合逻辑简单的情况
注意:run() 方法没有返回值、不能抛出受检异常,所有业务逻辑(比如循环、计算、休眠)都写在里面。
包装任务:传给 Thread 构造器
Runnable 本身不是线程,不能直接 start。必须把它作为参数传给 Thread 对象:
- new Thread(Runnable target) —— 最常用,系统自动分配线程名
- new Thread(Runnable target, String name) —— 可指定线程名,便于调试识别
同一个 Runnable 实例可被多个 Thread 对象使用,天然支持多线程共享数据(比如卖票场景中多个线程操作同一张票库存)。
启动线程:调用 start() 而非 run()
创建 Thread 对象后,必须调用 start() 方法才真正开启新线程并执行 run() 里的逻辑。
- 如果误调用 run(),只是在当前线程同步执行,不会产生并发效果
- start() 内部由 JVM 调度,确保 run() 在新线程中异步运行
实际用法示例(Lambda 版)
下面这段代码启动两个线程,分别打印自己的编号:
Runnable task = () -> {
for (int i = 0; i System.out.println(Thread.currentThread().getName() + ": " + i);
}
};
new Thread(task, "Worker-1").start();
new Thread(task, "Worker-2").start();
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











