java 线程中start方法与run方法的区别详细介绍

  1. 什么是线程

Java 中,我们可以通过 java.lang.Thread 类创建线程。线程是一个可以独立运行的子任务。与程序中的其他子任务不同,线程在操作系统层面上是一种独立的执行单元。在单个应用程序内,多个线程可以同时执行,每个线程都有自己的栈和局部变量,线程之间可以共享堆上的变量。由于线程在同时执行,因此在多线程编程中需要引入线程同步、锁和互斥等概念来保证数据的一致性和线程安全。

Java 线程的创建和运行分为两个步骤,分别是:

  • 通过继承 java.lang.Thread 类或实现 java.lang.Runnable 接口的方式创建线程;
  • 调用线程对象的 start() 方法启动线程。

  • start() 方法和 run() 方法的区别

start() 方法和 run() 方法都是线程的启动方法,但是它们的执行效果是不同的。

  • start() 方法用于启动一个新线程,该线程会在新的 JVM 栈中独立运行。start() 方法调用后立刻返回,新线程在 JVM 中独立运行,并且就绪线程池中的其它线程可能会在新线程运行之前执行。

  • run() 方法是线程体的逻辑代码,在 start() 方法被调用后,JVM 会自动调用该方法。run() 方法不会启动一个新的线程,而是在当前线程中执行。因此,如果直接调用 run() 方法,它会在当前线程中执行,不会启动新的线程。

下面是一个例子:

public class ThreadTest implements Runnable {
    @Override
    public void run() {
        System.out.println("Thread started!");
    }

    public static void main(String[] args) {
        Thread thread = new Thread(new ThreadTest());
        thread.start(); // 启动新线程
        // thread.run(); // 不会启动新线程,直接在当前线程中执行
    }
}

在上面的例子中,我们创建了一个实现 java.lang.Runnable 接口的类 ThreadTest。在 run() 方法中,我们打印了一条消息。在 main() 方法中,我们创建一个新的线程对象,并传入实例化的 ThreadTest 类。当我们调用 thread.start() 启动线程后,JVM 会自动调用 ThreadTest 类中的 run() 方法,输出 "Thread started!"

如果我们取消注释掉 thread.run(),直接在当前线程中执行,程序只会输出 "Thread started!",并不会启动新的线程。

  1. 总结

在 Java 线程中,start() 方法和 run() 方法是线程的启动方法,但是它们的执行效果是不同的。start() 方法会启动一个新的线程,而 run() 方法不会启动新线程,只会在当前线程中执行。

在实际开发中,我们应该优先使用 start() 方法来启动线程,避免使用 run() 方法直接在当前线程中执行,从而提高程序的并发处理能力。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java 线程中start方法与run方法的区别详细介绍 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • Javac/javap 自带工具简单使用讲解

    Javac和Javap是Java语言中自带的两个工具。Javac能够将Java源代码编译为可执行Java字节代码,而Javap则可以将Java字节码反编译为可读性更高的代码。 使用Javac编译Java源代码 Javac是Java编译器,可将Java源文件编译成字节代码。当然,在使用Javac之前,我们需要先下载并安装Java开发工具包(JDK)。以下是使用…

    Java 2023年5月23日
    00
  • Java笔记(16) Collection集合–>Set集合–>HashSet

    1. Set接口基本介绍 Set是无序集合(添加和取出的顺序不一致,但取出的顺序是固定的),没有索引 不允许重复元素,所以最多包含一个null JDK API中Set接口的实现类有: Abstract, ConcurrentHashMap.KeySetView, ConcurrentSkipListSet, CopyOnWriteArraySet, Enum…

    Java 2023年4月17日
    00
  • SpringBoot使用JSP作为视图模板的方法

    下面是SpringBoot使用JSP作为视图模板的完整攻略: 1. 新建SpringBoot项目 首先,我们需要新建一个SpringBoot项目。可以通过SpringBoot官网提供的快速构建工具Spring Initializr来完成项目初始化。 2. 配置build.gradle文件 在项目的build.gradle文件中需要添加以下依赖项和插件: de…

    Java 2023年6月15日
    00
  • Spring项目里将SQL语句写在.sql文件中的方法

    在Spring项目中,将SQL语句写在.sql文件中可以提高代码可维护性、可重用性。具体步骤如下: 1. 创建.sql文件 在项目中创建一个新的.sql文件,例如:user.sql,并将SQL语句写入该文件中。例如,以下是创建一个名为user的表的示例SQL: CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_…

    Java 2023年5月20日
    00
  • 玩转spring boot 结合AngularJs和JDBC(4)

    “玩转spring boot 结合AngularJs和JDBC(4)”是一篇技术教程,主要介绍了如何结合Spring Boot、AngularJs以及JDBC来实现Web应用开发。下面我会逐步讲解这篇文章的完整攻略,帮助读者更好地理解这篇文章的内容。 了解Spring Boot、AngularJs和JDBC在本文中,作者首先介绍了Spring Boot、An…

    Java 2023年6月16日
    00
  • java编程实现求质数与因式分解代码分享

    下面是 “Java编程实现求质数与因式分解代码分享” 的完整攻略。 目录 介绍 求质数的代码实现 因式分解的代码实现 示例说明 总结 介绍 本文将介绍Java编程实现求质数与因式分解的代码。当我们需要判断一个数是不是质数时,我们可以使用质数的定义:只有1和该数本身能够整除它,它才是质数。因式分解是指将一个数分解成几个互质的整数乘积的形式。这里我们使用两种算法…

    Java 2023年5月19日
    00
  • java == 引发的线上异常详解

    让我来详细讲解一下“java == 引发的线上异常详解”。 概述 在Java开发中,我们通常会使用“==”来比较两个对象是否相等。但是,如果使用不当,就可能会引发线上异常。本文将会详细探讨在Java中使用“==”可能会遇到的问题,以及如何避免这些问题。 引发异常的问题 基本类型与包装类比较 在Java中,基本类型和其对应的包装类是不同的类型,它们互相之间并不…

    Java 2023年5月27日
    00
  • java web个人通讯录系统设计

    Java web个人通讯录系统设计的完整攻略,一般包含以下几个部分: 1.需求分析 在进行系统设计之前,首先需要对需求进行分析。需求分析包括确定系统所需要的功能,确定系统的用户类型,确定系统的使用环境等。在进行需求分析时,需要充分考虑到用户的需求和实际使用环境,确保系统的功能和性能达到用户的期望。 2.系统设计 在确定了需求之后,需要进行系统设计。系统设计包…

    Java 2023年5月24日
    00
合作推广
合作推广
分享本页
返回顶部