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

2023-10-27

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


一、start()是什么?

用 start方法来启动线程,是真正实现了多线程, 通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法。但要注意的是,此时无需等待run()方法执行完毕,即可继续执行下面的代码。所以run()方法并没有实现多线程。

二、run()是什么?

run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码。

三、具体代码实例

下面我们来看具体实现,首先是验证调用run()方法并没有真正的启动一个线程

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        try {
            // 睡眠3秒
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("实现Runnable接口的线程");
    }
}

public class MyRunnableTest {
    public static void main(String[] args) throws InterruptedException {
        System.out.println("--------开始调用线程--------");
        Thread thread= new Thread(new MyRunnable());
        thread.run();
        System.out.println("--------调用线程结束--------");
    }
}

我们想要看到,如果run()方法启动了一个线程的话,那么“MyRunnable”中我们设置了休眠,主线程应该继续往下执行,那么输出的结果应该就是:

--------开始调用线程--------
--------调用线程结束--------
实现Runnable接口的线程

但实际运行结果是:

--------开始调用线程--------
实现Runnable接口的线程
--------调用线程结束--------

接下来我们验证,调用start()方法才算真正的启动了一个线程

public class MyRunnableTest {
    public static void main(String[] args) throws InterruptedException {
        System.out.println("--------开始调用线程--------");
        Thread thread= new Thread(new MyRunnable());
        thread.start();
        System.out.println("--------调用线程结束--------");
    }

}
--------开始调用线程--------
--------调用线程结束--------
实现Runnable接口的线程

总结来说就是:
线程的run()方法是由java虚拟机直接调用的,如果我们没有启动线程(没有调用线程的start()方法,而是在应用代码中直接调用run()方法,那么这个线程的run()方法其实运行在当前线程,(即run()方法的调用方所在的线程)之中,而不是运行在其自身的线程中,从而违背了创建线程的初衷,也就是说并没有创建一个新的线程。

四、start()和run()方法的区别:

1、start方法用来启动相应的线程。需要并行处理的代码放在run方法中,start方法启动线程后自动调用run方法;

2、run方法只是thread的一个普通方法,并没有创建新线程,而是运行在当前线程

3、run方法必须是public的访问权限,返回类型为void。


参考

链接: 源码解析
链接: 线程中start方法和run方法的区别
链接: run()方法和start()方法的区别

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

run()方法和start()方法的区别 的相关文章

  • 初始向量(IV)的CTR模式使用

    据我所知 CTR 模式不使用初始向量 它只需要一个计数器 用给定的密钥对其进行加密 然后将结果与明文进行异或以获得密文 其他分组密码模式 例如 CBC 在进行加密之前 会使用初始向量对明文进行异或 所以这是我的问题 我在 Java 中有以下
  • java本地时间格式不带年份

    我喜欢将本地时间格式格式化为不带年份的字符串 目前我可以显示包含年份的本地格式 java text DateFormat df java text DateFormat getDateInstance java text DateForma
  • 如何避免 Java 中的忙旋转

    我有一个多线程应用程序 其中一个线程向另一个线程发送消息 等待线程轮询消息并做出反应 处理锁 像这样 等待线程代码 while true if helloArrived System out println Got hello if bye
  • 向 JList 添加滚动条? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何将 JList 添加到 JScrollPane 把你的JList in a JScrollPane JScrollPane scrol
  • 如何让 HttpClient 返回状态码和响应正文?

    我试图让 Apache HttpClient 触发 HTTP 请求 然后显示 HTTP 响应代码 200 404 500 等 以及 HTTP 响应正文 文本字符串 重要的是要注意我正在使用v4 2 2因为大多数 HttpClient 示例都
  • Java 中支持多少维数组,例如 a[1][1][1][1]....[1]? [复制]

    这个问题在这里已经有答案了 Java支持多少维数组a 1 1 1 1 1 我可以为数组声明无限数量的维度吗 数组维数限制为 255 有趣的是 JLS定义的Java编程语言没有这样的限制 但是你可以在JVM规范 http docs oracl
  • 将 RequestBody json 转换为对象 - Spring Boot

    我是 java 开发的初学者 但之前有 PHP 和 Python 等编程语言的经验 对于如何进行 Spring Boot 的开发几乎没有什么困惑 我正在开发一个rest API 它有以下请求 key value key1 value1 pl
  • 整数与 int 比较

    我是新来的java 我现在正在学习非原始整数类型java 我知道以下比较无效并引发编译错误 String str c Char chr c if str chr return true 上面的代码片段给了我 Test java lineNu
  • 处理 ANTLR 4 中的错误

    遵循后接受的答案 https stackoverflow com a 18137301 2279200的指示处理 ANTLR4 中的错误 https stackoverflow com q 18132078 2279200问题 我遇到了以下
  • 维护插入顺序的并发集合[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以维护插入顺序的并发列表 有人有什么好的推荐吗 我看一些番石榴 例如SetFromMa
  • 为什么java(>=7版本)不支持运行没有main方法的程序? [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 class WithoutMain static System out println Without main class Sy
  • 读取不失真的灰度 PNG 图像文件

    我需要读取和处理大量的灰度 PNG 文件 我的意思是 如果它们在 Photoshop 或 GIMP 中打开 则图像模式为灰度 而不是具有灰度值的 RGB 图像 ImageIO 似乎没有实现这一点 它似乎将所有图像文件视为 sRGB 这会破坏
  • Elasticsearch NodeBuilder 与 TransportClient

    对于其他 Elasticsearch 开发人员来说 这可能是一个非常简单 而且愚蠢 的问题 这两者之间有什么区别 我正在从 Java Web 应用程序连接到远程 Elasticsearch 服务器 到目前为止我一直在使用 Transport
  • 如何在不同的班级中启动和停止计时器?

    我想测量从传入 HTTP 请求开始到应用程序到达某个点的时间 这两个时间点都位于不同的类中 我将如何启动和停止这些不同类别的计时器 我没有看到使用 MeterRegistry 中的 命名 计时器的方法 我该怎么办呢 您可以使用 AOP 如下
  • Wildfly 10.1 消耗所有核心

    我们最近将银行应用程序从 java 1 6 升级到 1 8 将 jboss 4 x 升级到 wildfly 10 1 我们观察到 java 消耗了机器上可用的所有核心 10 有人可以告诉是什么原因吗 通常情况下 jboss 4 x 的最大
  • 如何从Java中的连接获取查询字符串?

    我正在编写一个方法 尝试记录数据库调用 形成连接到它的连接 在查询之后 有很多地方调用方法 connect 来启动并调用 cleanUp 方法来结束 我不能并且不想修改每个地方 所以顺序是这样的 Connection con connect
  • 有没有办法处理Java堆空间异常[重复]

    这个问题在这里已经有答案了 我正在寻找将文件输入流转换为大文件 文件大小为 100MB 并且抛出 java lang OutOfMemoryError Java Heap space import java io FileInputStre
  • Java 中 .NET 的 Lambda 表达式

    我最近 再次 从 C 迁移到 Java 但我非常怀念 lambda 表达式和 C 的 IEnumerable Foreach 之类的东西 所以我正在寻找Java中的lambda表达式库 有比这更好的图书馆吗LambdaJ http code
  • 用 lambda 表达式替换匿名函数

    我在 Java 8 映射操作中传递一个函数 Intellij 告诉我它可以用 lambda 表达式替换 但我不知道如何在不创建中间对象结构的情况下做到这一点 这就是我所做的 List
  • 将 JSON 发送到 Spring MVC 控制器

    我正在尝试将 JSON 发送到 Spring MVC 控制器 在 Spring MVC 方面 一切都配置正确 下面是代码 但似乎没有运行

随机推荐

  • 对c语言for循环的理解

    for i lt 0 i lt 5 i 如果一直符合条件 i lt 5 那么循环到最后i 5 否则i lt 5 可根据 i 的值判断循环体是否一直满足某个条件 如下一个简单例子 判断数组是否存在某个元素 include
  • 安装 webstorm 断点调试工具 jetbrains ide support

    先下载离线插件包 http www cnplugins com devtool jetbrains ide support download html 并解压 然后进入google设置 选择开发者模式 加载扩展程序 最后如图
  • Qt 使用布局管理器,控件大小未能自适应变化

    问题 使用布局管理器管理子部件 使用了QVHlayout管理器 发现控件大小固定 即使通过拖动窗口也不能改变控件的大小 布局管理器不是自动控制部件的大小吗 为什么没有生效 如图所示 解决办法 对子部件添加延申策略 setSizePolicy
  • 图解通信原理与案例分析-26: 5G NR是如何支持海量机器类通信mMTC的?移动通信对物联网的支持

    前言 移动通信最初是解决人与人之间的语音通信 后来发展成了人与人之间的文本通信 到了4G LTE 已经很好的解决了人与人之间的视频通信 到了5G 人与人之间的高速率的数据通信在LTE的基础之上得到了进一步优化和加强 称之为eMBB eMBB
  • ffmpeg使用qsv解码碰到的问题

    ffmpeg使用qsv硬解码出来的视频帧格式是AV PIX FMT NV12格式的 ffmpeg使用qsv硬解码出来的视频帧格式是AV PIX FMT NV12格式的 在调用sws getContext函数时第三个参数必须强制传入AV PI
  • Ubuntu 22.04编译安装Redis 7

    Ubuntu 22 04编译安装Redis 7 一 下载 1 访问Redis官方网站 https redis io 点击顶部菜单栏右侧的 Download 进入下载页面 2 在下载页面的左侧可以看到Redis相关信息 右键单击 Downlo
  • 蓝桥杯-模拟

    星期一 611 import datetime start datetime date 1901 1 1 end datetime date 2000 12 31 delta datetime timedelta days 1 s 0 wh
  • java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long 错误分析

    从内容中已经知道是类转换报错 但是为什么会报错呢 int类型是可以转换为long类型的 对这种低精度是可以直接转为高精度的 但是报错也明确的提示了 java lang Integer cannot be cast to java lang
  • HTML <strong> 标签

    定义和用法 以下元素都是短语元素 虽然这些标签定义的文本大多会呈现出特殊的样式 但实际上 这些标签都拥有确切的语义 我们并不反对使用它们 但是如果您只是为了达到某种视觉效果而使用这些标签的话 我们建议您使用样式表 那么做会达到更加丰富的效果
  • 实现在最新版本的cesium中引用叠加shp文件的类的功能

    因为刚接触cesium不久 对js的编码规范什么的也不是很懂 所以这么简单的问题就搞了好几天 不过总算有所突破了 网上看到这个文章 http blog sina com cn s blog 15e866bbe0102xxd1 html 里面
  • springboot+springcloud相关面试题

    什么是springboot 用来简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置 properties或yml文件 创建独立的spring引用程序 main方法运行 嵌入的Tomcat 无需部署war文件 简化maven
  • 学习笔记(103):R语言入门基础-数据点类型(type参数)

    立即学习 https edu csdn net course play 24913 285847 utm source blogtoedu type参数 type p 在图形中数据显示为点 type l 在图形中数据显示为线 type b
  • sort排序用法

    Python sorted函数 我们需要对List Dict进行排序 Python提供了两个方法对给定的List L进行排序 方法1 用List的成员函数sort进行排序 在本地进行排序 不返回副本方法2 用built in函数sorted
  • 在矩池云使用Llama2-7B的具体方法

    今天给大家分享如何在矩池云服务器使用 Llama2 7b模型 硬件要求 矩池云已经配置好了 Llama 2 Web UI 环境 显存需要大于 8G 可以选择 A4000 P100 3090 以及更高配置的等显卡 租用机器 在矩池云主机市场
  • 图像对比度,亮度

    很多时候 一张图像被过度曝光 显得很白 或者光线不足显得很暗 这个时候可以通过调节图像的这两个基本属性 亮度与对比度 来获得整体效果的提升 从而获得质量更高的图片 1 算子operator 首先我们给出算子的概念 一般的图像处理算子都是一个
  • 电源学习总结(五)——开关电源基本原理

    前面讲了一些线性稳压的原理和设计的基本方法 事实上 除了一些功率较大或者对精度要求较高的电源设计 使用集成的线性稳压芯片很少出现 翻车 事故 一般只需关注输入输出范围即可 此外 需注意由于集成的开关电源芯片 尤其是贴片封装的 如SOT 22
  • 【CUDA】初步了解PageLocked host memory的mapped memory功能使用

    导言 大家都知道CUDA 中PageLocked memory 相比portable memory 有着多种优势 在有front side bus的系统中 pagelocked memory 所提供的host 与device之间的数据传送速
  • 硬盘突然提示没有初始化_分享一下固态硬盘不认盘的修复方法

    写在开头 固态硬盘比较害怕突然停电 如果里面有重要数据 请勿用此方法尝试修复 即便可以成功 里面的数据也已经被抹除 需要恢复数据的话 还是需要找专业的数据恢复公司来做 切勿自己折腾 进入正题 前段时间淘了一块威刚的SP550 120G SA
  • 常用脚本(九)Unity_Input

    1 输出鼠标位置 在Update方法中 Debug Log Input mouseposition 2 判断鼠标是否点击 返回 True 和 false 每帧都输出 在Update方法中 Debug Log Input anykey 3 I
  • run()方法和start()方法的区别

    run 方法和start 方法的区别 文章目录 run 方法和start 方法的区别 一 start 是什么 二 run 是什么 三 具体代码实例 四 start 和run 方法的区别 参考 一 start 是什么 用 start方法来启动