首页 > Java > Java面试题 > 正文

线程的 run()和 start()有什么区别?

星降
发布: 2025-08-28 09:54:01
原创
941人浏览过
start()方法启动新线程并执行run()任务,直接调用run()只是同步执行,无法并发。

线程的 run()和 start()有什么区别?

简单来说,

run()
登录后复制
方法是线程要执行的任务,而
start()
登录后复制
方法才是真正启动线程的关键。直接调用
run()
登录后复制
只是普通的方法调用,不会创建新的线程。

线程的

run()
登录后复制
start()
登录后复制
区别,这可是面试常考点,也是理解多线程并发的基础。

为什么不能直接调用
run()
登录后复制
方法?

直接调用

run()
登录后复制
方法,相当于在当前线程(通常是
main
登录后复制
线程)中执行一个普通方法。这并不会创建新的线程,也就没有并发执行的效果。所有代码都在同一个线程中顺序执行,如果
run()
登录后复制
方法阻塞,整个程序都会卡住。

想象一下,你在厨房做饭,

run()
登录后复制
方法是炒菜,
start()
登录后复制
方法是请了另一个厨师来帮你炒菜。如果你自己直接炒菜(调用
run()
登录后复制
),那还是你一个人在忙活。但如果你请了另一个厨师(调用
start()
登录后复制
),你们就可以同时炒不同的菜,效率大大提高。

start()
登录后复制
方法做了什么?

start()
登录后复制
方法才是启动线程的正确方式。它会执行以下几个关键步骤:

  1. 操作系统申请创建新的线程。 这才是真正创建并发的根本。
  2. run()
    登录后复制
    方法的调用委托给新创建的线程。
    新线程会负责执行
    run()
    登录后复制
    方法中的代码。
  3. 线程进入就绪状态。 线程创建完成后,不会立即执行,而是等待 CPU 调度。

可以把

start()
登录后复制
方法想象成一个“启动器”,它负责创建新的线程,并让新线程开始执行
run()
登录后复制
方法中的任务。

线程池和
run()
登录后复制
方法的关系?

线程池是一种管理和复用线程的机制。线程池中的线程已经创建好,并等待执行任务。当我们向线程池提交任务时,线程池会选择一个空闲的线程来执行任务的

run()
登录后复制
方法。

线程池避免了频繁创建和销毁线程的开销,提高了程序的性能。它通过复用线程来执行不同的

run()
登录后复制
方法,从而实现并发执行。

稿定AI社区
稿定AI社区

在线AI创意灵感社区

稿定AI社区60
查看详情 稿定AI社区

举个例子,一个Web服务器使用线程池来处理客户端请求。每个客户端请求就是一个任务,服务器将任务提交给线程池,线程池中的线程会执行处理请求的代码(相当于

run()
登录后复制
方法)。

如何正确使用
start()
登录后复制
run()
登录后复制
方法?

  1. 永远不要直接调用
    run()
    登录后复制
    方法。
    这是新手常犯的错误。
  2. 通过调用
    start()
    登录后复制
    方法来启动线程。
    这是启动线程的唯一正确方式。
  3. run()
    登录后复制
    方法中编写线程要执行的任务。
    这是线程的核心逻辑。
public class MyThread extends Thread {
    @Override
    public void run() {
        // 线程要执行的任务
        System.out.println("线程 " + Thread.currentThread().getName() + " 正在执行...");
    }

    public static void main(String[] args) {
        MyThread thread1 = new MyThread();
        MyThread thread2 = new MyThread();

        // 启动线程
        thread1.start();
        thread2.start();
    }
}
登录后复制

这段代码创建了两个线程

thread1
登录后复制
thread2
登录后复制
,并通过
start()
登录后复制
方法启动它们。每个线程都会执行
run()
登录后复制
方法中的代码,打印一条消息。

为什么
run()
登录后复制
方法可以被重写?

run()
登录后复制
方法是
Thread
登录后复制
类中的一个方法,它可以被重写,是因为它定义了线程要执行的任务。通过重写
run()
登录后复制
方法,我们可以自定义线程的行为。

Thread
登录后复制
类本身只提供了一个默认的
run()
登录后复制
方法,它什么也不做。我们需要继承
Thread
登录后复制
类,并重写
run()
登录后复制
方法,才能让线程执行我们想要的任务。

线程的生命周期和
run()
登录后复制
方法的关系?

线程的生命周期包括以下几个状态:

  • 新建(New): 线程被创建,但尚未启动。
  • 就绪(Runnable): 线程可以被 CPU 调度执行。
  • 运行(Running): 线程正在被 CPU 执行。
  • 阻塞(Blocked): 线程因为某些原因暂停执行,例如等待 I/O 或锁。
  • 死亡(Dead): 线程执行完毕或发生异常而终止。

run()
登录后复制
方法的执行贯穿了线程的整个生命周期。当线程进入运行状态时,它会执行
run()
登录后复制
方法中的代码。当
run()
登录后复制
方法执行完毕或发生异常时,线程会进入死亡状态。

总而言之,理解

run()
登录后复制
start()
登录后复制
方法的区别是掌握多线程编程的关键。记住,
start()
登录后复制
方法负责启动线程,而
run()
登录后复制
方法负责定义线程要执行的任务。不要直接调用
run()
登录后复制
方法,而是通过
start()
登录后复制
方法来启动线程,才能实现真正的并发执行。

以上就是线程的 run()和 start()有什么区别?的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号