在Java多线程编程体系中,run方法是定义线程执行内容的核心载体,每个线程被调度运行时,都会执行该方法内部封装的业务逻辑。它是Thread类的核心方法之一,同时也可以通过实现Runnable接口来定义对应的执行逻辑。

run方法的基本定义
run方法是java.lang.Thread类中的实例方法,同时java.lang.Runnable接口也定义了该方法,方法签名固定为无参数、无返回值的形式:
// Thread类中的run方法定义
public void run() {
if (target != null) {
target.run();
}
}
// Runnable接口中的run方法定义
public abstract void run();
当线程的target(即传入的Runnable实现对象)不为空时,Thread类的默认run方法会调用target的run方法;如果开发者重写了Thread的run方法,或者传入了自定义Runnable实现,就会执行自定义的逻辑。
run方法和start方法的区别
很多初学者会混淆这两个方法的作用,两者的核心差异如下:
- start方法:是启动线程的专用方法,调用后会向JVM申请创建一个新的线程,新线程进入就绪状态,等待CPU调度,调度到之后才会执行run方法里的逻辑。
- run方法:只是一个普通的方法,如果直接调用run方法,不会创建新线程,会在当前调用者的线程中直接执行run方法里的代码,相当于普通的方法调用。
下面的示例可以直观展示两者的区别:
public class RunTest {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
System.out.println("执行逻辑的线程名:" + Thread.currentThread().getName());
});
// 直接调用run方法,在当前main线程执行
System.out.println("直接调用run,当前线程名:" + Thread.currentThread().getName());
thread.run();
// 调用start方法,在新线程执行
System.out.println("调用start,当前线程名:" + Thread.currentThread().getName());
thread.start();
}
}
执行上述代码后,输出结果类似如下:
直接调用run,当前线程名:main 执行逻辑的线程名:main 调用start,当前线程名:main 执行逻辑的线程名:Thread-0
如何自定义run方法逻辑
实际开发中,我们通常需要自定义线程的执行逻辑,有两种常用方式:
方式一:继承Thread类重写run方法
class MyThread extends Thread {
@Override
public void run() {
// 自定义线程执行逻辑
for (int i = 0; i < 3; i++) {
System.out.println("MyThread执行:" + i);
}
}
}
// 使用方式
public class Test1 {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
}
}
方式二:实现Runnable接口作为Thread的target
class MyRunnable implements Runnable {
@Override
public void run() {
// 自定义线程执行逻辑
for (int i = 0; i < 3; i++) {
System.out.println("MyRunnable执行:" + i);
}
}
}
// 使用方式
public class Test2 {
public static void main(String[] args) {
Thread thread = new Thread(new MyRunnable());
thread.start();
}
}
run方法的注意事项
- run方法不能手动抛出受检异常,也不能声明抛出受检异常,如果需要处理异常,只能在run方法内部用try-catch捕获。
- 如果run方法执行结束,线程的生命周期就会进入终止状态,无法再次调用start方法启动同一个线程对象。
- 不要手动调用run方法来启动线程,否则无法实现多线程并发的效果,只会串行执行逻辑。
注意:run方法本身没有线程调度的能力,它只是线程执行逻辑的容器,真正的线程启动和调度是由start方法和JVM的线程调度器共同完成的。
Java线程run方法Thread类Runnable接口线程执行逻辑修改时间:2026-06-10 12:54:21