Thread.java start方法和run方法的区别

【java】Thread.start 它是怎么让线程启动的呢 线程的启动过程涉及到了 JVM 的参与,所以如果没有认真了解过,确实很难从一个本地方法了解的如此透彻。整个源码分析可以结合着代码调用UML时序图进行学习,基本核心过程包括:Java 创建线程和启动、调用本地方法 start0()、JVM 中 JVM_StartThread 的创建和启动、设置线程状态等待被唤醒、根据不同的OS启动线程并唤醒、最后回调 run() 方法启动 Java 线程。有时候可能只是一步很简单的方法,也会有它的深入之处,当真的懂了以后,就不用死记硬背。 阅读详情

Thread.java start方法和run方法的区别

我们知道java中,使用start或者run都可以开启一个线程,那这两者有什么区别呢?

Thread.java类中的start()方法会通知 "线程规划器" 此线程已经准备好了,等待调用线程对象的run()方法。系统会安排一个合适时间来调用Thread中的run()方法,开启线程。
而使用thread.run()并不会交给"线程规划器"进行处理,而是由主线程来调用run()方法。两者最重要的区别是前者是异步的,而后者是同步的,即必须等到run()方法中的代码都执行完毕后才可以再继续执行后面的代码。

例一:使用thread.run()

public class ThreadTest extends Thread {
	
	@Override
	public void run() {
		for(int i =0;i<5;i++)
			try {
				sleep(1000);
				System.out.println("wangcan");
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
	}
}
public class MainTest {
	public static void main(String[] args){
		ThreadTest threadTest = new ThreadTest();
		threadTest.run();
		System.out.println("32424");
	}
}

可以看到输出结果是:
wangcan
wangcan
wangcan
wangcan
wangcan
32424

System.out.println("32424")必须等待threadTest对象的run()方法中的内容执行完后才会执行。

例二:使用thread.start()方法

public class ThreadTest extends Thread {
	
	@Override
	public void run() {
		for(int i =0;i<5;i++)
			try {
				sleep(1000);
				System.out.println("wangcan");
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
	}
}
public class MainTest {
	public static void main(String[] args){
		ThreadTest threadTest = new ThreadTest();
		threadTest.start();
		System.out.println("32424");
	}
}

可以看到,输出结果是:

32424
wangcan
wangcan
wangcan
wangcan
wangcan

两个线程(主线程和子线程)是异步的。

K230开发板实战:YOLOv8n模型部署全流程(附常见报错解决方案) 本文详细介绍了在K230开发板上部署YOLOv8n模型的完整流程,包括模型选型、配置文件优化和运行时调优。特别针对常见的'生成部署文件异常'等问题提供了实用解决方案,帮助开发者高效完成嵌入式AI模型的部署与优化。 阅读详情

相关推荐

保姆级教程:用Docker Compose一键部署WVP-PRO+ZLM+录像服务(含Nginx反代)

本文提供了一套完整的容器化GB28181视频平台部署方案,通过Docker Compose实现WVP-PRO、ZLMediaKit(ZLM)和录像服务的一键式部署。详细介绍了环境准备、架构设计、容器化部署实战以及高级配置优化,帮助用户快速搭建高性能视频监控管理平台,适用于安防行业和物联网设备管理场景。

weixin_30415113的博客 861

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

一、start()和run()方法的区别: 1、start方法用来启动相应的线程; 2、run方法只是thread的一个普通方法,在主线程里执行; 3、需要并行处理的代码放在run方法中,start方法启动线程后自动调用run方法; 4、run方法必须是public的访问权限,返回类型为void。 二、进一步的理解 线程的run()方法是由java虚拟机直接调用的,如果我们没有...

Evan's Blog ٩(๑❛ᴗ❛๑)۶ 1万+

Cheat Engine实战:多级指针逆向破解游戏内存的5个关键步骤(附C++模拟代码)

本文详细解析了使用Cheat Engine进行多级指针逆向破解游戏内存的完整流程。通过5个关键步骤,从定位动态地址到逐层追踪指针链,最终构建稳定指针路径。文章结合C++模拟代码,深入剖析了指针链的底层汇编原理,并提供了高级排查技巧,帮助读者掌握逆向工程中的核心内存追踪技术。

weixin_29239279的博客 306

Java并发编程—Thread类中的start()方法如何启动一个线程【原理分析】?

的c文件里面的JVM_StartThread方法,然后在jvm.cpp文件中找到JVM_StartThread方法执行流程,然后通过os创建线程并最终执行。

小魏快起床的博客 2707

Blender点云渲染实战:用Geometry Nodes快速搞定论文配图(附Cycles渲染技巧)

本文详细介绍了如何利用Blender的Geometry Nodes系统,高效地将三维点云数据转化为高质量的科研论文配图。通过实战步骤,从数据导入、节点化几何处理、材质赋予到Cycles渲染引擎的优化设置,手把手教你制作出专业、美观的可视化图像,助力科研成果展示。

hp777的博客 265

双参数威布尔分布(Weibull分布)参数计算(根据故障数据,求双参数威布尔分布的参数详细步骤)

根据故障数据求威布尔分布参数步骤 根据众多文献研究,设备故障数据大多服从指数分布、威布尔分布或对数正态分布。其中威布尔分布较为常用,本文主要介绍威布尔分布的简单应用,并根据某设备故障数据为例简单介绍威布尔分布参数的计算方法。 参考文献11参考文献22 1.双参数威布尔分布的概率密度函数、概率分布函数、可靠度函数: 2.预处理故障数据 将故障数据按时间排序,假设设备分别在以下时间点失效:11.1 、23.5、58.4……则将此时间从小到大排序。并计算中位秩。中位秩的计算公式如下: 其中i表示第几个数据,n

biaochengxiaobai的博客 4万+

thread.start java_Java Thread start()方法

Thread类的start()方法用于开始执行线程。 此方法的结果是执行两个并发运行的线程:当前线程(从调用start方法返回)和另一个线程(执行其run方法)。start()方法在内部调用Runnable接口的run()方法,以在单独的线程中执行run()方法中指定的代码。启动线程执行以下任务:它统计一个新线程线程从初始状态移动到可运行状态。当线程有机会执行时,它的目标run()方法将运行。语法...

weixin_34052529的博客 447

AI产品经理面试宝典第9天:关于AI产品经理的挑战与转型怎么回答

AI技术重构产品逻辑,AI产品经理需直面三大核心命题:用户定位差异、技术融合边界、商业价值转化。本文从千道真题中提炼出面试高频考点,剖析AI产品经理如何突破传统思维定式,在B端需求与C端体验间构建价值桥梁,用数据驱动产品创新,破解技术落地的隐性壁垒。掌握这三重跃迁法则,助你在AI浪潮中脱颖而出。

打造全国最全的AI Agent开发知识领域的博客 175

java线程系列一:Thread类中的start()方法与run方法

1.java中的线程状态 在java中,线程通常有五种状态:创建,就绪,运行,阻塞与死亡。 1:创建(NEW) 在生成线程对象的时候,并没有调用start方法,这是线程的创建状态。 2:就绪(RUNABLE) 当调用线程对象的start方法以后,线程就进入了就绪状态。但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。 3...

bitcarmanlee的博客 4065

Python与ArcGIS系列(二)获取地图文档

在ArcPy中,要引用当前的地图文档(Map Document),可以使用 mapping 模块中的 MapDocument 类。值得注意的是,在arcgis内部python窗口运行该代码才能访问已加载进arcgis的文档,如果通过其他idle则无法访问。要引用磁盘上的地图文档并对其进行一些设置,同样可以使用ArcPy中的 mapping 模块和 MapDocument 类。对于我们平常的工作,接触最多的就是图层数据处理,获取图层后就可以方便地进行下一步处理。

weixin_43894929的博客 2200

KoboldCpp vs Ollama vs llama.cpp 全面对比(2026工程视角)

本文对比分析了KoboldCpp、Ollama和llama.cpp三大本地AI推理工具的核心差异。llama.cpp作为基础引擎性能最强但上手困难;KoboldCpp在其基础上增加了UI界面,适合娱乐创作;Ollama则提供最简化的模型管理和API服务。性能实测显示:llama.cpp>KoboldCpp>Ollama。选型建议:新手用Ollama快速入门,玩家选KoboldCpp获得交互体验,工程师用llama.cpp追求极致性能。三者定位清晰:性能极限、使用体验和开发效率各有所长。

刘一说的IT专栏 905

java Thread中,run方法和start方法的区别,下面说法错误的是?

java Thread中,run方法和start方法的区别,下面说法错误的是? A通过调用Thread类的start()方法来启动一个线程,这时此线程是处于就绪状态,并没有运行。 B他们都可以实现了多线程运行。 Crun方法是thread的一个普通方法调用。 D调用start方法后,一旦得到cpu时间片,就开始执行run()方法。 正确答案:B 解析: start方法...

越来越好ing的博客 4052

基于GEC6818开发板+Linux+Qt设计的智能养老院出入管理系统(195)

当前,传统的养老院出入管理模式普遍存在信息更新滞后、数据统计繁琐、实时监控能力不足等问题,难以满足现代养老机构对安全管理与服务质量提升的需求。本系统设计正是针对这些问题,通过集成先进的硬件设备如高性能GEC6818开发板以及RFID刷卡模块,结合稳定高效的嵌入式Linux操作系统和QT开发框架,构建一套功能齐全、操作直观、响应迅速的智能出入管理系统。 该系统能自动记录并实时显示老人的进出时间,方便管理人员及时了解每位老人的活动轨迹,同时具备强大的后台管理功能,支持管理员便捷地进行老人信息的增删改查操作。通

1069

java Thread的start和run方法的区别

一、认识Thread的 start() 和 run() 概述: t.start()会导致run()方法被调用,run()方法中的内容称为线程体,它就是这个线程需要执行的工作。 用start()来启动线程,实现了真正意义上的启动线程,此时会出现异步执行的效果,即在线程的创建和启动中所述的随机性。 而如果使用run()来启动线程,就不是异步执行了,而是同步执行,不会达到使用线程的意义 1....

SmileTimLi的博客 7026

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【Java面经整理】Thread中,run方法和start方法的区别

java Thread中,run方法和start方法的区别,下面说法错误的是? ps:Java面试题整理专栏,专门收集整理搬运面试题和答案 链接:https://www.nowcoder.com/questionTerminal/8b92d18f34a743adbdb1f2e76a8d2232 来源:牛客网 java Thread中,run方法和start方法的区别,下面说法错误的是? A.通过调用Thread类的start()方法来启动一个线程,这时此线程是处于就绪状态,并没有运行。 B.他们都可以实现了

码农翻身的博客 910

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java -- Thread中start和run方法的区别

文章目录一、认识Thread的 start() 和 run()1。start():2。run():3。总结:二、代码实例:三、线程状态说明: 一、认识Thread的 start() 和 run() 1。start(): 我们先来看看API中对于该方法的介绍: 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。 结果是两个线程并发地运行;当前线程(从调用返回给 start 方法)和另一个线程(执行其 run 方法)。 多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动。用star

qq_47768542的博客 1493

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

java thread等特_Java Thread的start和run方法的区别

一、认识Thread的 start() 和 run()“ 概述:t.start()会导致run()方法被调用,run()方法中的内容称为线程体,它就是这个线程需要执行的工作。用start()来启动线程,实现了真正意义上的启动线程,此时会出现异步执行的效果,即在线程的创建和启动中所述的随机性。 而如果使用run()来启动线程,就不是异步执行了,而是同步执行,不会达到使用线程的意义1.start():...

weixin_36387104的博客 134

java面试题36Thread 类中的start() 和 run() 方法有什么区别?

Java线程:start() vs run()核心区别 start()和run()的本质差异在于线程执行方式: 1️⃣ start() 启动新线程,异步执行run()方法 只能调用一次,触发线程状态转换 底层通过JNI创建系统级线程 2️⃣ run() 直接在当前线程同步执行 可多次调用,不创建新线程 无法实现多线程并发 关键区别: ✔️ start()实现多线程异步 ✔️ run()是普通方法同步调用 典型错误: 误用run()代替start() 重复调用start() 正确选择方法才能有效利用多线程能力

qq_39275653的博客 745

Java中thread的start和run方法的区别

thread.start()之后在主线程外开启了新的线程,并且新开启的线程已经就绪,并没有运行,一旦得到cpu时间片,就开始执行run()方法,run方法运行结束,此线程随即终止。一个线程只能start一次。 Thread.run()是在主线程中调用并执行run方法的内容,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目...

qq_34820468的博客 377

java run 方法_Thread对象run方法与start()方法的区别

start()方法与run()方法的区别Thread对象run方法与start()方法的作用不同,start()方法用于启动线程,run()方法用于执行线程的运行时代码。通过start方法启动线程,然后JVM会回调线程的运行时代码。当我们new出一个Thread对象的时候,其仅仅只是Java中的一个对象而已。只有当我们调用了start方法的时候,其才会真正的成为一个运行的线程,也只有当线程启动后,...

weixin_35935712的博客 286

java Thread中,run方法和start方法的区别

java Thread中,run方法和start方法的区别,下面说法错误的是? 通过调用Thread类的start()方法来启动一个线程,这时此线程是处于就绪状态,并没有运行。 他们都可以实现了多线程运行。 run方法是thread的一个普通方法调用。 调用start方法后,一旦得到cpu时间片,就开始执行run()方法。 答案:B  

Java那点事 | 学习●思考●分享 | Java技术交流QQ群:83753349 799

java Thread的start和run方法的区别

java Thread(线程)start和run方法的区别 各自作用: 1)调用start方法方可启动线程; 2)run方法只是Thread的一个普通方法,如果直接调用则还是顺序执行,没有异步效果。 start()方法和run()方法的区别: t.start(); 该行代码相当于是启动线程,异步操作; t.run(); 该行代码相当于是使用Thread类中的run方法而已,只是主线程的一个普通的方法。 ...

Sw_Pro的博客 359

Java线程Thread中start方法 和 run方法 的区别

Thread中start方法 和 run方法 的区别 1.使用 start方法启动线程的时候,JVM虚拟机会在内存中给线程分配一个独立的内存空间,有自己的局部变量等 代码示例 public class ThreadDemo extends Thread{ String s; @Override public void run() { for (int i...

刘小义的博客 494

Java Thread 类中的 start() 和 run() 方法有什么区别?

Thread 类中的 start() 和 run() 方法有什么区别?解答。。。

Regino的博客 806
上一篇: 二分搜索的拓展用法
下一篇: 快速排序算法
cassiePython
博客等级 码龄12年 303粉丝 135原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值