java中thread线程start和run的区别

yizhihongxing

Java中,线程是程序的执行流,它是在进程中执行的。可以通过继承Thread类或实现Runnable接口来创建线程。在创建线程时,我们需要注意线程的生命周期。在Java中,线程的生命周期可以分为New、Runnable、Blocked、Waiting、Timed Waiting和Terminated这6种状态。

线程的启动是通过调用start方法来实现的;线程的执行是通过run方法来实现的。那么,start和run方法有什么区别呢?

区别1:start方法和run方法的功能不同

start方法的作用是启动一个新线程,新线程会执行对应Thread对象的run方法,当调用start方法后,该线程会被加入到线程调度器的等待队列中,等待获取CPU时间片,从而运行线程。

run方法的作用是实现线程的执行体,也就是线程要执行的任务或操作。如果直接调用run方法,那么相当于在当前的主线程中执行该方法,不会创建新的线程。

下面是两个示例说明:

// 示例1:使用start方法
public class MyThread extends Thread {

    @Override
    public void run() {
        // 实现线程的执行体
        for (int i = 1; i <= 5; i++) {
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }
    }

    public static void main(String[] args) {
        MyThread thread1 = new MyThread();
        MyThread thread2 = new MyThread();
        thread1.start();
        thread2.start();
    }
}

// 示例2:直接调用run方法
public class MyThread implements Runnable {

    @Override
    public void run() {
        // 实现线程的执行体
        for (int i = 1; i <= 5; i++) {
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }
    }

    public static void main(String[] args) {
        MyThread thread1 = new MyThread();
        MyThread thread2 = new MyThread();
        thread1.run();  // 直接调用run方法,相当于在主线程中执行
        thread2.run();
    }
}

在示例1中,通过使用start方法来启动两个线程,新线程会执行MyThread对象的run方法,输出结果如下:

Thread-0:1
Thread-1:1
Thread-0:2
Thread-1:2
Thread-0:3
Thread-1:3
Thread-0:4
Thread-1:4
Thread-0:5
Thread-1:5

在示例2中,直接调用run方法,相当于在主线程中执行,输出结果如下:

main:1
main:2
main:3
main:4
main:5
main:1
main:2
main:3
main:4
main:5

可以看到,直接调用run方法并没有创建新的线程,而是在主线程中执行了MyThread对象的run方法,因此两个线程的执行结果都是在主线程中输出,没有体现出多线程的优势。

区别2:start方法和run方法执行的时间点

start方法调用后会将线程加入到等待队列中,等待获取CPU时间片运行;而run方法直接在当前线程中执行,不会新建线程。

当调用start方法时,线程被加入到等待队列中,等待获取CPU时间片,同时当前线程继续执行下面的代码。当线程获取到时间片后,才会执行线程的run方法,完成对应的任务。

下面是一个示例:

public class MyThread extends Thread {

    @Override
    public void run() {
        try {
            Thread.sleep(5000);  // 线程睡眠5s
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + "执行完成");
    }

    public static void main(String[] args) {
        MyThread thread1 = new MyThread();
        thread1.start();
        System.out.println(Thread.currentThread().getName() + "继续执行");
    }
}

在上面的示例中,线程1被启动后,会睡眠5s,然后输出一个执行信息。在启动线程1后,主线程继续执行,输出另一个执行信息。输出结果如下:

main继续执行
Thread-0执行完成

可以看到,当主线程输出“继续执行”时,线程1并没有立即执行对应的任务,而是被加入到了等待队列中,等待获取CPU时间片才开始执行任务。5s后,线程1才输出执行完成的信息。

综上所述,start方法和run方法的区别在于:

  • start方法是启动一个新线程,run方法是实现线程的执行体;
  • start方法会将线程加入到等待队列中,等待获取CPU时间片运行,而run方法直接在当前线程中执行;
  • 调用start方法启动线程时,当前线程继续执行下面的代码;线程获取时间片后执行run方法。

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

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

相关文章

  • Servlet实现分页效果

    下面是详细讲解如何在Servlet中实现分页效果的完整攻略: 第一步:获取总记录数 在进行分页时,需要先获取到数据的总记录数。可以通过查询数据表中的记录数或者使用一些第三方工具来获取。 第二步:设置每页显示的记录数和当前页码 需要设置每页显示的记录数和当前页码,这两个值通常是从前端传递过来的。为了避免一些异常情况,需要对这两个值做一些合法性验证。 // 获取…

    Java 2023年6月16日
    00
  • MyBatis-Ext快速入门实战

    MyBatis-Ext快速入门实战攻略 MyBatis-Ext是MyBatis的一个增强工具包,可以提供更加便捷的使用方式,提高开发效率。本文将提供一个MyBatis-Ext的快速入门实战攻略,包含配置、实现及示例演示。 配置 引入MyBatis-Ext的依赖 xml <dependency> <groupId>com.github.…

    Java 2023年5月20日
    00
  • 9个非常棒的Android代码编辑器 移动开发者的最爱

    9个非常棒的Android代码编辑器 移动开发者的最爱 作为一名Android开发者,一个好用的代码编辑器对开发效率的提升具有非常重要的作用。这篇攻略介绍了9个非常棒的Android代码编辑器,让您从中选择一个,成为您的移动开发工具箱的一部分。 1. Android Studio Android Studio 是谷歌推出的Android应用开发者的集成开发环…

    Java 2023年5月26日
    00
  • Java 函数编程详细介绍

    Java 函数编程详细介绍 什么是函数编程 函数编程是一种编程范式,它将计算机程序视为数学函数的组合,避免了代码状态的改变和可变数据的使用。函数编程强调函数的纯洁性和不可变性,更关注数据的转换和流,而不只是程序的执行顺序。 Java 中的函数编程 在 Java 中,函数编程由 Lambda 表达式和函数接口的引入开始。Lambda 表达式是一种轻量级的语法,…

    Java 2023年5月23日
    00
  • Java 中的注解详解及示例代码

    Java 中的注解详解及示例代码 什么是注解? 注解(Annotation)是 Java 5.0 版本引入的一种注释机制,它可以用于向程序中添加元数据,以此来帮助程序进行特定的处理,如编译、运行、部署等。 注解的作用 注解可以用于描述一个类、方法、变量等元素的信息,以便于编译、运行等后续操作时进行相应的处理。它可以帮助我们更加精确地描述程序中的某个元素的属性…

    Java 2023年5月23日
    00
  • JSP页面跳转方法小结

    JSP页面跳转方法小结 在JSP编程中,页面跳转是很常见的需求。本文将详细讲解JSP页面跳转的方法及其使用场景。 转发(Forward) 概述 转发是指在服务器内部,将请求资源(request)转移到另一个资源上的过程。使用转发时可以在服务器内部跳转页面,且浏览器地址栏中的URL不会发生改变。 使用方法 JSP的转发可以使用request对象的getRequ…

    Java 2023年6月15日
    00
  • JAVA生产者消费者(线程同步)代码学习示例

    JAVA生产者消费者(线程同步)代码学习示例 什么是生产者消费者模型 生产者消费者模型是一种常用的线程同步模型,它通过在多个线程之间协调共享资源的访问,来提高系统的效率和可靠性。在生产者消费者模型中,生产者线程负责生成数据,消费者线程负责消费数据,两者通过共享队列来协作,实现生产与消费的同步和协调。 学习示例1:基本实现 假设有一个生产者线程和一个消费者线程…

    Java 2023年5月26日
    00
  • java基础的详细了解第八天

    Java基础的详细了解第八天攻略 一、多线程 1. 线程的创建(继承Thread类) Java中创建线程有两种方式,一种是继承Thread类,另一种是实现Runnable接口。第一种方式的具体代码如下: class MyThread extends Thread { @Override public void run() { // 线程要执行的代码 } } …

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