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

🍎个人博客:个人主页

🏆个人专栏:JAVA

⛳️ 功不唐捐,玉汝于成


目录

前言

正文

[run() 方法:](#run() 方法:)

[start() 方法:](#start() 方法:)

区别总结:

结语

我的其他博客


前言

多线程编程是Java中一个重要的概念,能够有效地提高程序的性能和响应性。在理解多线程时,run()start() 方法是关键的概念,它们决定了线程的行为和执行方式。深入了解这两个方法的区别,对于正确地设计和使用多线程是至关重要的。

正文

在Java中,线程的 run()start() 是与多线程编程相关的两个方法,它们有着不同的作用和用法。

run() 方法:

  • run() 方法是 Thread 类的一个普通方法,用于定义线程的主体逻辑。当直接调用 run() 方法时,该方法会在当前线程的上下文中执行,而不会创建新的线程。

  • 直接调用 run() 方法,不会实现多线程的并发执行,而只是在当前线程中按照顺序执行 run() 方法的内容。

    复制代码
    public class MyRunnable implements Runnable {
        @Override
        public void run() {
            // 线程的主体逻辑
            System.out.println("Running in thread: " + Thread.currentThread().getName());
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            MyRunnable myRunnable = new MyRunnable();
            myRunnable.run(); // 在当前线程中执行 run() 方法
        }
    }

    start() 方法:

  • start() 方法是 Thread 类的一个方法,用于启动一个新的线程。当调用 start() 方法时,会创建一个新的线程,并在新线程的上下文中执行 run() 方法的内容。

  • 直接调用 start() 方法会导致新线程的创建和执行,实现多线程并发执行。

    复制代码
    public class MyThread extends Thread {
        @Override
        public void run() {
            // 线程的主体逻辑
            System.out.println("Running in thread: " + Thread.currentThread().getName());
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            MyThread myThread = new MyThread();
            myThread.start(); // 启动一个新的线程,执行 run() 方法
        }
    }

区别总结:

  • run() 方法是定义线程主体逻辑的普通方法,当直接调用时,它在当前线程的上下文中执行,而不会创建新的线程。
  • start() 方法是启动一个新线程的方法,当调用时,它会创建一个新的线程,并在新线程的上下文中执行 run() 方法的内容,实现多线程并发执行。
  • 直接调用 run() 方法不会创建新线程,只是在当前线程中按顺序执行 run() 方法的内容,不具备多线程的特性。

在使用多线程时,通常应该调用 start() 方法来启动新线程,以实现并发执行,而不是直接调用 run() 方法。

结语

在Java中,run() 方法和 start() 方法代表着多线程编程的两种不同方式。run() 作为线程的主体逻辑定义,当直接调用时在当前线程中执行;而 start() 用于启动新线程,创建新的执行上下文,并在其中执行 run() 方法,实现多线程的并发执行。正确使用这两个方法是编写高效、可靠多线程代码的关键。在设计多线程应用时,请根据需求选择适当的方式,确保线程安全和良好的性能。希望通过对 run()start() 的深入理解,你能够更加自信和熟练地处理多线程编程的挑战。

我的其他博客

【软件工程】走进敏捷开发:灵活、协作、迭代的软件工艺之旅-CSDN博客

【软件工程】融通未来的工艺:深度解析统一过程在软件开发中的角色-CSDN博客

【软件工程】走进瀑布模型:传统软件开发的经典之路-CSDN博客

【软件工程】走近演化过程模型:软件开发的不断进化之路-CSDN博客

【软件工程】漫谈增量过程模型:软件开发的逐步之道-CSDN博客

【Spring】理解IoC与AOP:构建灵活而模块化的软件架构-CSDN博客

【MySQL】数据库并发控制:悲观锁与乐观锁的深入解析-CSDN博客

【MySQL】数据库规范化的三大法则 --- 一探范式设计原则-CSDN博客

【MySQL】数据库中为什么使用B+树不用B树-CSDN博客

【MySQL】SQL优化-CSDN博客

【MySQL】脏读、不可重复读、幻读介绍及代码解释-CSDN博客

【MySQL】多表连接查询-CSDN博客

【MySQL】数据库索引(简单明了)-CSDN博客

【Web开发】深度剖析RBAC:概念、实现方法、优势及在Web应用中的应用-CSDN博客

【Mybatis】深入学习MyBatis:高级特性与Spring整合-CSDN博客

【Mybatis】深入学习MyBatis:CRUD操作与动态SQL实战指南-CSDN博客

【MySQL】数据库索引(简单明了)-CSDN博客

相关推荐
炸膛坦客8 小时前
单片机/C/C++八股:(二十)指针常量和常量指针
c语言·开发语言·c++
智者知已应修善业8 小时前
【proteus中lm339电压滞回比较器达到三角波转换成方波】2023-4-13
驱动开发·经验分享·笔记·硬件架构·proteus·硬件工程
兑生8 小时前
【灵神题单·贪心】1481. 不同整数的最少数目 | 频率排序贪心 | Java
java·开发语言
daidaidaiyu8 小时前
一文学习 Spring 声明式事务源码全流程总结
java·spring
551只玄猫8 小时前
新编大学德语1第三版笔记 第5课Essen und Trinken
笔记·学习笔记·德语·外语·德语a1·自学德语·新编大学德语
发现一只大呆瓜9 小时前
React-彻底搞懂 Redux:从单向数据流到 useReducer 的终极抉择
前端·react.js·面试
炸膛坦客9 小时前
单片机/C/C++八股:(十九)栈和堆的区别?
c语言·开发语言·c++
零雲9 小时前
java面试:了解抽象类与接口么?讲一讲它们的区别
java·开发语言·面试
不只会拍照的程序猿9 小时前
《嵌入式AI筑基笔记02:Python数据类型01,从C的“硬核”到Python的“包容”》
人工智能·笔记·python
uzong9 小时前
Skill 被广泛应用,到底什么是 Skill,今天详细介绍一下
人工智能·后端·面试