0

0

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

星降

星降

发布时间:2025-08-28 09:54:01

|

963人浏览过

|

来源于php中文网

原创

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()
方法,从而实现并发执行。

DaGaoPeng(大高朋网团购程序)
DaGaoPeng(大高朋网团购程序)

大高朋团购系统是一套Groupon模式的开源团购程序,开发的一套网团购程序,系统采用ASP+ACCESS开发的团购程序,安装超简,功能超全面,在保留大高朋团购系统版权的前提下,允许所有用户免费使用。大高朋团购系统内置多种主流在线支付接口,所有网银用户均可无障碍支付;短信发送团购券和实物团购快递发货等。 二、为什么选择大高朋团购程序系统? 1.功能强大、细节完善 除了拥有主流团购网站功能,更特别支

下载

举个例子,一个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()
方法来启动线程,才能实现真正的并发执行。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

481

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

143

2025.12.24

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

61

2025.12.01

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

9

2026.01.19

微信聊天记录删除恢复导出教程汇总
微信聊天记录删除恢复导出教程汇总

本专题整合了微信聊天记录相关教程大全,阅读专题下面的文章了解更多详细内容。

50

2026.01.18

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

108

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

152

2026.01.16

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

58

2026.01.16

java数据库连接教程大全
java数据库连接教程大全

本专题整合了java数据库连接相关教程,阅读专题下面的文章了解更多详细内容。

44

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Node.js 教程
Node.js 教程

共57课时 | 8.9万人学习

Vue 教程
Vue 教程

共42课时 | 6.7万人学习

Go 教程
Go 教程

共32课时 | 3.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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