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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

765

2023.08.10

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

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

377

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

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

32

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

29

2026.01.21

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

103

2026.02.06

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

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

99

2025.12.01

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

38

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

83

2026.03.09

热门下载

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

精品课程

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

共57课时 | 13.2万人学习

Vue 教程
Vue 教程

共42课时 | 9.5万人学习

Go 教程
Go 教程

共32课时 | 6.1万人学习

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

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