当前位置: 首页 > news >正文

直接调用 Java 线程的 run() 方法会发生什么?

文章目录

  • 前言
  • 回顾
    • `run()` 方法 vs `start()` 方法
      • `run()`方法
      • `start()`方法
  • 直接调用 `run()` 方法的影响
    • 直接调用 `run()` 方法
    • 调用 `start()` 方法
  • 示例解析
  • 结论
  • 个人简介

前言

  • 在Java中,多线程编程是一个重要的概念,尤其是在处理并发任务时。线程是Java中实现多线程的一种方式。在使用线程时,理解 run() 方法和 start() 方法之间的区别是至关重要的。本文将深入探讨如果直接调用线程的 run() 方法会发生什么。
  • 先说结论:直接调用 run() 方法不会启动一个新的线程,它只是普通方法调用,代码在当前线程中同步顺序执行。

回顾

  • Java 提供了继承 Thread 类、实现Runnable接口两种方式来实现线程,无论使用哪种方式,都需要重写 run() 方法,这是线程执行的入口点。启动一个线程通常使用 Thread 对象的 start() 方法,该方法会触发线程的启动,并最终调 用run() 方法。

run() 方法 vs start() 方法

run()方法

  • run()方法包含了线程要执行的代码。
  • 直接调用run()方法不会启动一个新线程,它只是在当前线程中执行run()方法体中的代码。
  • 换句话说,直接调用run()方法相当于调用一个普通的方法,没有并发行为。

start()方法

  • start()方法会创建一个新的线程,并在新的线程中执行run()方法。
  • 调用start()方法会使线程从“新建”状态变为“就绪”状态,等待CPU调度。

直接调用 run() 方法的影响

  • 为了更好地理解直接调用 run() 方法的影响,考虑以下示例代码:
class MyThread extends Thread {public void run() {System.out.println("Thread is running");}
}public class Main {public static void main(String[] args) {MyThread thread = new MyThread();// 直接调用run()方法thread.run();// 调用start()方法thread.start();}
}
  • 在上述代码中,thread.run()thread.start() 的行为是完全不同的。

直接调用 run() 方法

  • 当thread.run()被调用时,输出“Thread is running”。这段代码在主线程中执行,没有启动新的线程。此时,主线程和线程对象的run()方法体是同步顺序执行的。

调用 start() 方法

  • 当thread.start()被调用时,输出“Thread is running”。这段代码在一个新线程中执行,与主线程并发运行。主线程和新启动的线程是同时执行的,体现了多线程的并发特性。

示例解析

  • 通过以下代码示例可以更清晰地看出区别:
class MyRunnable implements Runnable {public void run() {for (int i = 0; i < 5; i++) {System.out.println("Runnable running " + i);}}
}public class Main {public static void main(String[] args) {MyRunnable myRunnable = new MyRunnable();Thread thread = new Thread(myRunnable);// 直接调用run()方法myRunnable.run();// 调用start()方法thread.start();}
}// 输出
Runnable running 0
Runnable running 1
Runnable running 2
Runnable running 3
Runnable running 4
Runnable running 0
Runnable running 1
Runnable running 2
Runnable running 3
Runnable running 4
  • 前五行输出是 myRunnable.run() 直接调用产生的,后五行是 thread.start() 启动的新线程产生的。

结论

  • 直接调用 run() 方法不会启动一个新的线程,它只是普通方法调用,代码在当前线程中同步顺序执行。而调用 start() 方法则会启动一个新的线程,并在该线程中执行 run() 方法的代码。

个人简介

👋 你好,我是 Lorin 洛林,一位 Java 后端技术开发者!座右铭:Technology has the power to make the world a better place.

🚀 我对技术的热情是我不断学习和分享的动力。我的博客是一个关于Java生态系统、后端开发和最新技术趋势的地方。

🧠 作为一个 Java 后端技术爱好者,我不仅热衷于探索语言的新特性和技术的深度,还热衷于分享我的见解和最佳实践。我相信知识的分享和社区合作可以帮助我们共同成长。

💡 在我的博客上,你将找到关于Java核心概念、JVM 底层技术、常用框架如Spring和Mybatis 、MySQL等数据库管理、RabbitMQ、Rocketmq等消息中间件、性能优化等内容的深入文章。我也将分享一些编程技巧和解决问题的方法,以帮助你更好地掌握Java编程。

🌐 我鼓励互动和建立社区,因此请留下你的问题、建议或主题请求,让我知道你感兴趣的内容。此外,我将分享最新的互联网和技术资讯,以确保你与技术世界的最新发展保持联系。我期待与你一起在技术之路上前进,一起探讨技术世界的无限可能性。

📖 保持关注我的博客,让我们共同追求技术卓越。

http://www.lryc.cn/news/383533.html

相关文章:

  • 计算机毕业设计Thinkphp/Laravel学生考勤管理系统zyoqy
  • 3浏览器安全
  • 昇思25天学习打卡Day01
  • Python-爬虫 下载天涯论坛帖子
  • 创建github个人博客
  • 【五子棋game】
  • 从入门到精通:使用Python的Watchdog库监控文件系统的全面指南
  • Linux 进程管理指令
  • Java OA系统通知公告模块
  • 简约的服务器监控工具Ward
  • 新能源发电乙级资质所需办理标准
  • Elasticsearch:使用 Llamaindex 的 RAG 与 Elastic 和 Llama3
  • AcWing算法基础课笔记——高斯消元
  • 【JavaScript脚本宇宙】图形魔术:探索领先的图像处理库及其独特功能
  • Nemotron-4
  • 【神经网络】神经元的基本结构和训练过程
  • 第28课 绘制原理图——绘制导线
  • NLP 相关知识
  • Java中的设计模式:实战案例分享
  • 并发编程理论基础——合适的线程数量和安全的局部变量(十)
  • Python使用抽象工厂模式和策略模式的组合实现生成指定长度的随机数
  • python-17-零基础自学python-
  • Web应用和Tomcat的集成鉴权1-BasicAuthentication
  • 解决Linux下Java应用因内存不足而崩溃的问题
  • ardupilot开发 --- 视觉伺服 篇
  • KVM配置嵌套虚拟化
  • Springboot应用的信创适配-补充
  • 制图工具(14)导出图层字段属性信息表
  • 代码随想录——买股票的最佳时机Ⅱ(Leecode122)
  • 使用Servlet开发javaweb,请求常见错误详解及其解决办法【404、405、500】