高级java每日一道面试题-2024年12月18日-并发篇-Thread 类中的start()和 run()方法有什么区别 ?

news/2024/12/22 21:31:31 标签: java, sleep, wait, Thread

如果有遗漏,评论区告诉我进行补充

Thread_start_run__1">面试官: Thread 类中的start()和 run()方法有什么区别 ?

我回答:

在Java中,Thread类是用于创建和管理线程的。了解Thread类中的start()和run()方法之间的区别,对于深入理解Java并发编程至关重要。以下是这两个方法的详细区别和解释:

1. start()

  • 定义: start() 是一个非静态方法,定义在 Thread 类中。
  • 作用: 启动一个新的线程,并让 JVM 调用该线程的 run() 方法。
  • 行为:
    • 当调用 start() 方法时,JVM 会为新线程分配必要的资源,并将其加入到系统的线程调度器中。
    • 然后,JVM 会在新的线程上下文中执行 run() 方法,而不是在调用 start() 的线程中执行。
  • 签名: public void start()
  • 注意事项:
    • 每个线程只能调用一次 start() 方法。如果尝试再次启动已经启动过的线程,将会抛出 IllegalThreadStateException
示例代码
java">public class StartMethodExample extends Thread {
    @Override
    public void run() {
        System.out.println("线程正在运行...");
    }

    public static void main(String[] args) {
        StartMethodExample thread = new StartMethodExample();
        thread.start(); // 启动新线程并执行 run() 方法
    }
}

2. run()

  • 定义: run() 是一个非静态方法,也定义在 Thread 类中,默认实现为空。
  • 作用: 包含线程要执行的代码逻辑。
  • 行为:
    • run() 方法中的代码是在新线程中执行的,当 start() 方法被调用时,JVM 会自动调用 run() 方法。
    • 如果直接调用 run() 方法(即不通过 start()),它只是作为一个普通的方法调用,在当前线程中执行,不会创建新的线程。
  • 签名: public void run()
  • 注意事项:
    • 直接调用 run() 不会启动新线程,因此不会并发执行。
示例代码
java">public class RunMethodExample extends Thread {
    @Override
    public void run() {
        System.out.println("线程正在运行...");
    }

    public static void main(String[] args) {
        RunMethodExample thread = new RunMethodExample();
        thread.run(); // 直接调用 run(),没有启动新线程
    }
}

主要区别总结

特性start()run()
功能启动新线程并让 JVM 调用 run() 方法包含线程要执行的代码逻辑
线程创建创建新线程不创建新线程
并发执行
调用方式必须通过 start() 启动新线程可以直接调用,但不会并发执行
异常处理无特殊异常
多次调用每个线程只能调用一次可以多次调用,但不会创建多个线程

使用场景

  • start(): 当你需要真正启动一个新的线程,并希望该线程独立于主线程并发执行时,应该使用 start() 方法。
  • run(): 如果你只需要在一个线程中执行某些代码,并且不需要并发执行,可以直接调用 run() 方法,但这通常不是推荐的做法。

总结

理解 start()run() 的区别对于正确地编写多线程程序非常重要。简单来说,start() 用于启动新线程,而 run() 则包含线程的执行逻辑。如果你想要并发执行任务,请务必使用 start() 来启动线程,而不是直接调用 run() 方法。


http://www.niftyadmin.cn/n/5795913.html

相关文章

【libuv】Fargo信令2:【深入】client为什么收不到服务端响应的ack消息

客户端处理server的ack回复,判断链接连接建立 【Fargo】28:字节序列【libuv】Fargo信令1:client发connect消息给到server客户端启动后理解监听read消息 但是,这个代码似乎没有触发ack消息的接收: // 客户端初始化 void start_client(uv_loop_t

(有源码)基于springboot+vue的校园外卖服务系统设计与实现-P10102

项目说明 所发布的项目均由我部署运行验证,可保证项目系统正常运行,以及提供完整源码。 如需要远程部署/定制/讲解系统,可以联系)。定制项目未经同意不会上传! 项目源码获取方式放在文章末尾处 注:项目…

ML 系列:第 40 节 — 最大似然MLE 的简单问题

一、说明 最大似然估计 (MLE) 是统计学和机器学习中用于估计概率模型参数的基本技术。在本文中,我们将介绍一个使用 MLE 估计正态分布参数的简单示例。我们将使用 Python 进行实现和可视化。 二、问题陈述 假设我们有一组数据点,我们认为这些数据点来…

【Spring】方法注解@Bean,配置类扫描路径

阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 引入 一:Bean方法注解 1:方法注解要搭配类注解使用 2:执行结果 …

记录学习《手动学习深度学习》这本书的笔记(六)

看到第九章:现代循环神经网络了,循环神经网络这块真的有点难,而且老师也没有细讲这块,只能自己慢慢理解。 第九章:现代循环神经网络 9.1 门控循环单元(GRU) 这一节介绍了一个循环神经网络的“…

数据倾斜的原因以及解决方法

数据倾斜是大数据处理中常见的问题,特别是在使用Hadoop这类分布式计算框架时。数据倾斜指的是在数据处理过程中,某些数据块或节点承担了比其他节点更多的工作负载,导致整体处理效率降低。以下是数据倾斜的原因和一些解决办法: 一…

基于JSP动漫论坛的设计与实现【源码+文档】

目录 摘 要 Abstract 1. 绪论 1.1 课题背景 1.2 国内外现状 1.3 动漫论坛系统特点 1.4 发展前景 1.5 所做的主要工作 2. 可行性分析及需求分析 2.1 可行性分析 2.1.1 经济可行性 2.1.2 技术可行性 2.1.3 运行可行性 2.2 需求分析 2.2.1 功能需求 …

wireshark初认识

wireshark初认识 文章目录 wireshark初认识免责声明wirseshark 特点wireshark 功能数据传输的逻辑简易了解wireshark 下载与安装平替软件 免责声明 本文是学习与泷羽Sec B站课程的课程笔记内容,仅作学习使用,如有破坏网络安全的行为,本人概不…