多线程中run方法和start方法的异同

在多线程编程中,run() 和 start() 是两种完全不同的方法,它们的核心区别在于 线程的启动和执行方式。以下是它们的异同点总结:


1. 核心区别

方法run()start()
作用直接调用普通方法,同步执行启动新线程,异步执行 run() 方法
线程行为在当前线程中运行,不会创建新线程创建新线程,由 JVM 调用 run()
调用次数可多次调用只能调用一次(重复调用会抛 IllegalThreadStateException

2. 代码示例(Java)

class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("当前线程: " + Thread.currentThread().getName());
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread thread = new MyThread();

        // 直接调用 run():同步执行(主线程调用)
        thread.run();  // 输出: 当前线程: main

        // 调用 start():异步执行(新线程调用)
        thread.start(); // 输出: 当前线程: Thread-0
    }
}

3. 关键异同点

相同点
  1. 最终都会执行 run() 方法中的代码逻辑。

  2. 属于同一个线程类(如 Thread 或 Runnable 的实现类)。

不同点
特性run()start()
线程创建❌ 不创建新线程✅ 创建新线程
执行方式同步(阻塞当前线程)异步(不阻塞当前线程)
调用限制可重复调用仅能调用一次
底层机制普通方法调用通过 JVM 调用本地方法启动线程

4. 为什么需要 start()

  • 多线程的本质:通过 start() 触发 JVM 创建新的线程,由操作系统调度执行 run() 方法,实现并发。

  • 直接调用 run() 只是普通方法调用,完全失去了多线程的意义。


5. 注意事项

  1. 不要重复调用 start()
    一个线程对象只能调用一次 start(),否则会抛出异常。

  2. 资源竞争
    start() 启动的线程可能因 CPU 调度顺序导致输出结果不确定(需同步控制)。

  3. Runnable 接口
    实现 Runnable 时,仍需通过 new Thread(runnable).start() 启动线程。


总结

  • 用 run():当普通方法调用,单线程场景。

  • 用 start():需要多线程并发时,由 JVM 自动调用 run()

多线程的核心目的是通过 start() 实现异步执行,而直接调用 run() 仅仅是串行执行代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值