前言

大年初二,大家新年快乐,我又开始码字了。写这篇文章,源于在家和基友交流的时候,基友问到了,我猛然发现还真是这么回事,多线程启动调用的都是start,那么为什么没人掉用run呢?于是打开我的idea,翻一波代码,带大家一探究竟。

继承thread类实现多线程

我们知道java有三种方式实现多线程,这里直接用继承的方式进行试验,其他方式同理。我们要做的是首先声明一个线程。然后去调用,最终根据结果归纳run和start的区别。

定义一个线程类。

class MyThread extends Thread {

private String title;

public MyThread(String title) {

this.title = title;

}

@Override

public void run() {

for(int x = 0; x < 5 ; x++) {

System.out.println(this.title + "运行,x = " + x);

}

}

}

复制代码

在我们的主类中,起三个线程,看看调用的结果。代码如下:

public class ExtendsThread {

public static void main(String[] args) {

new MyThread("线程A").start();

new MyThread("线程B").start();

new MyThread("线程C").start();

}

}

复制代码

直接运行main方法。

观察结果我们发现,三个线程随机交替执行,取决于cpu的调度。

我们再使用run方法来进行调用,查看结果

public class ExtendsThread {

public static void main(String[] args) {

new MyThread("线程A").run();

new MyThread("线程B").run();

new MyThread("线程C").run();

}

}

复制代码

结果如下:

看到这里细心的小伙伴发现了,这个run方法好像是顺序执行的啊!

的确是的,run方法并不会实现多线程。而是顺序执行。那么为什么会产生这样的结果呢?

根本原因

查看run方法的源代码

我们发现run方法只是简单的调用了实现类的run。没有进行任何的多线程处理。

查看start方法的源码

start方法就不一样了。我们可以看到关键的代码就是start0方法。var1理解为线程为启动,调用start0后,线程启动。继续追踪start0.

这个是一个使用jni的java本地方法,jvm根据不同的平台,调度的线程方法不同。

借用一张网上图,一目了然。

start() 方法调用 start0() 方法后,该线程并不一定会立马执行,只是将线程变成了可运行状态。具体什么时候执行,取决于 CPU ,由 CPU 统一调度。

总结

Java 中实现真正的多线程是 start 中的 start0() 方法,run() 方法只是一个普通的方法。

java线程开启不了_Java中多线程启动,为什么调用的是start方法,而不是run方法?...相关推荐

  1. java 线程不安全例子_Java中多线程安全问题实例分析

    案例package com.duyang.thread.basic.basethread; /** * @author :jiaolian * @date :Created in 2020-12-16 ...

  2. Java 多线程启动为什么调用 start() 方法而不是 run() 方法?

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:终于放弃了单调的swagger-ui了,选择了这款神器-knife4j个人原创100W+访问量博客:点击前往,查 ...

  3. 更新尺寸调用什么方法_Java 多线程启动为什么调用 start() 方法而不是 run() 方法?...

    多线程在工作中多多少少会用到,启动 多线程调用的是 start() 方法,而不是 run() 方法,这是为什么呢? 在探讨这个问题之前,先来了解(复习)一些多线程的基础知识~ 线程的状态 Java 中 ...

  4. python多线程没有java_Java 多线程启动为什么调用 start() 方法而不是 run() 方法?...

    多线程在工作中多多少少会用到,我们知道启动多线程调用的是 start() 方法,而不是 run() 方法,你知道原因吗? 在探讨这个问题之前,我们先来了解一些多线程的基础知识~ 线程的状态 Java ...

  5. java 组合优与继承_Java中为什么老鸟要告诉你优先使用组合而不是继承?

    新的一周,新的干货分享 大家知道,面向对象有三个特征:继承.封装和多态.现在,我们谈谈关于继承的一些问题.了解一下继承的优点.缺点,以及继承缺点的解决方案. 继承的起源,来自于多个类中相同特征和行为的 ...

  6. java int转无符号_Java 中使用无符号整型(unsigned int)的使用方法

    背景 计算机科班出身大多学过离散数学,或者理工类专业也大多学习过 C 或 C++ 语言,从中我们了解到基本类型的整形有 short.int.long 等,还分别有无符号(unsigned)和带符号(s ...

  7. java线程能做什么_java中的多线程能做什么 ?基本作用能说下吗?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 给你写个最简单的 多线程分同步和异步的,我已经给你写上了synchronized ,但注释了,你可以顺便看看加上它和去掉他的区别! public clas ...

  8. java 线程安全的原因_java的多线程:java安全问题产生的原因与JMM的关系

    一.多线程产生安全问题 1.Java内存模型 共享内存模型指的就是Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入时,能对另一个线程可见. 从抽象的角度来看,JMM定义了线程和主内存 ...

  9. java线程池怎么创建_java中的线程池,如何创建?

    Java中的线程池它是线程的容器,或者(换句话说,它是具有执行任务能力的线程的集合). 我们可以使用ThreadPool框架来定位(或实现)线程池. 线程池可以包含多个线程.每当我们执行任何任务时,线 ...

最新文章

  1. nginx服务器的配置
  2. Ollydbg使用教程学习总结(二)
  3. SpringBoot —— Bean的注入方式
  4. 蓝桥杯第八届省赛JAVA真题----正则问题
  5. 马士兵 redis 百度网盘_西甲周六攻略:巴萨 马竞 塞维利亚出战
  6. 一起谈.NET技术,编写T4模板无法避免的两个话题:quot;Assembly Lockingquot;amp;quot;Debugquot;...
  7. 【redis】 windows 32x 64x
  8. 团队开发冲刺1.2(2015.5.10)
  9. 计算两个NSDate是否处于同一天
  10. 特朗普社交应用登苹果App Store下载量榜首
  11. asio 组播包ssdp
  12. CentOS 6.5 安装 Python3
  13. java循环队列_Java版-数据结构-队列(循环队列)
  14. easydarwin 安装_EasyDarwin HLS直播详细配置指南
  15. Cisco Devnet CCNA【200-901】题库稳定
  16. FFmpeg合并ts文件为mp4文件
  17. 强网杯2022 pwn 赛题解析——yakagame
  18. Ubuntu18.04安装QQ For Linux
  19. 大型综合网络搭建详细步骤教程
  20. 【讲座笔记】科研论文的构思、规划和写作--中南大帅词俊

热门文章

  1. OpenCV4 C++学习 必备基础语法知识二
  2. SWAGAN:基于样式的小波驱动生成模型
  3. 掌贝获2000万美元B+轮融资,和智投资领投、味千中国和金沙江创投跟投
  4. jdbc报Incorrect string value: '\xF0\x9F\xA4\x97' for column
  5. History(历史)命令用法
  6. mysql合并查询结果及为表和字段取别名
  7. 上海往事之参加上海分公司组织的TeamBuilding
  8. Android 改变窗口标题栏的布局
  9. jquery实现单行滚动效果
  10. elasticsearch date格式问题