java start_Java多线程start()方法原理解析

1、为什么启动线程不用run()方法而是使用start()方法

run()方法只是一个类中的普通方法,调用run方法跟调用普通方法一样

而start()是创建线程等一系列工作,然后自己调用run里面的任务内容。

验证代码:

/**

* @data 2019/11/8 - 下午10:29

* 描述:run()和start()

*/

public class StartAndRunMethod {

public static void main(String[] args) {

Runnable runnable = new Runnable() {

@Override

public void run() {

System.out.println(Thread.currentThread().getName());

}

};

runnable.run();

new Thread(runnable).start();

}

}

结果:

main

Thread-0

2、start()源码解读

启动新线程检查线程状态

public synchronized void start() {

/**

* This method is not invoked for the main method thread or "system"

* group threads created/set up by the VM. Any new functionality added

* to this method in the future may have to also be added to the VM.

*

* A zero status value corresponds to state "NEW".

*/

if (threadStatus != 0)

throw new IllegalThreadStateException();

关于threadStatus源码:

/*

* Java thread status for tools, default indicates thread 'not yet started'

*/

private volatile int threadStatus;

通过代码可以看到就是threadStatus就是记录Thread的状态,初始线程默认为0.

加入线程组

/* Notify the group that this thread is about to be started

* so that it can be added to the group's list of threads

* and the group's unstarted count can be decremented. */

group.add(this);

调用start0()

boolean started = false;

try {

start0();

started = true;

} finally {

try {

if (!started) {

group.threadStartFailed(this);

}

} catch (Throwable ignore) {

/* do nothing. If start0 threw a Throwable then

it will be passed up the call stack */

}

}

}

start0()方法使用c++编写的方法,这些代码在gdk代码中,所以这里不再这里探究了。

3、start()方法不能使用多次

通过刚刚源码分析,就知道start方法刚开始就检查线程状态,当线程创建后或结束了,该状态就不同于初始化状态就会抛出IllegalThreadStateException异常。

测试代码:

start不可以使用多次

/**

* @data 2019/11/8 - 下午11:57

* 描述:start不可以使用多次

*/

public class CantStartTwice {

public static void main(String[] args) {

Thread thread = new Thread();

thread.start();

thread.start();

}

}

4、注意点:

start方法是被synchronized修饰的方法,可以保证线程安全。

由jvm创建的main方法线程和system组线程,并不会通过start来启动。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

YOLOv12改进专栏目录 | 本专栏持续更新500+篇内容 | 包含各种卷积、主干网络、各种注意力机制、检测头、损失函数、小目标检测改进、二次创新模块、独家创新等几百种创新点改进 《YOLOv12高效涨点改进专栏》提供500+创新改进方案,涵盖卷积、主干网络、注意力机制等模块优化,适用于检测、分割等任务。改进点来自顶会论文和个人经验,支持多种模型版本和任务场景。专栏包含详细教程、数据集增强、性能评估工具等,帮助科研人员快速实现模型优化和论文发表。提供完整运行项目和环境配置指导,适合计算机及相关专业研究人员使用,持续更新保障长期科研需求。 阅读详情

相关推荐

深度学习流体力学:基于PyTorch的物理信息神经网络(PINN)完整实现

本文介绍了基于物理信息神经网络(PINN)的深度学习流体力学求解器实现。首先阐述了Navier-Stokes方程的理论基础,包括连续性方程和动量守恒方程,并解释了PINN的核心原理:将物理方程作为约束条件嵌入神经网络损失函数。以经典的lid-driven cavity流动为例,详细展示了使用PyTorch实现的全流程,包括神经网络架构设计、自动微分求解Navier-Stokes方程、多约束条件优化训练等关键环节。该求解器通过将物理方程、边界条件和初始条件整合到损失函数中,实现了对流体力学问题的端到端求解,为

源代码杀手的博客 9733

Java|多线程与高并发】详解start()方法和run()方法的区别

Java并发编程中 start()方法和run()方法的区别 以及run()的一些误区

云泽野の编程日记 3340

AI挖矿技术全景解析:从智能勘探到自主开采的2025年度技术演进与产业变革

随着全球关键矿产资源需求激增与开采难度加剧,人工智能(AI)技术正在重塑矿业全生命周期。本文系统综述了2025年AI挖矿技术的最新进展,涵盖从地质勘探、资源评估到自主开采、安全监控的完整技术链条。基于Elsevier 2025年发表的最新研究成果及IEEE会议前沿动态,本文深入分析了深度学习、强化学习、计算机视觉等核心技术在矿物识别、品位预测、设备维护等场景的应用机制。研究数据显示,AI技术已使勘探成功率提升45%,设备停机时间减少35%,整体运营效率提高40%以上。

nmdbbzcl的博客 2027

java中run()方法start()方法

public class HelloSougou{ public static synchronized void main(String[] args){ Thread t = new Thread(){ public void run(){ Sougou(); } t.ru...

tmax52HZ的博客 2295

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

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

小魏快起床的博客 2701

Java中线程启动:start()与run()方法的区别

线程是并发执行的基本单位,而`Thread`类则是实现多线程编程的核心。在使用`Thread`类或其子类创建线程时,`start()`和`run()`是两个至关重要的方法,但它们的作用和调用方式却大相径庭。

✨ 欢迎来到【Seal ^_^ 的CSDN博客】!✨ 6581

start()方法和run()方法

一、start()方法 1、start()方法含义 1、启动新线程。当我们执行了start()方法之后这个线程不一定会立刻执行,其实是在告诉jvm中的线程调度器在合适的时间去启动。例如:我们可能会创建两个线程,分别是线程1和线程2,但线程1先调用start()方法,线程2后调用,缺发现线程2先执行,这其实是不违背启动顺序的。也就是说调用start()方法的顺序并不能决定执行的顺序。 2、一个...

我是太阳 4868

java 多线程 start_Java多线程start()方法原理解析

1、为什么启动线程不用run()方法而是使用start()方法run()方法只是一个类中的普通方法,调用run方法跟调用普通方法一样而start()是创建线程等一系列工作,然后自己调用run里面的任务内容。验证代码:/*** @data 2019/11/8 - 下午10:29* 描述:run()start()*/public class StartAndRunMethod {public sta...

weixin_39756540的博客 487

java 动态调用方法_Java 多线程启动为什么调用 start() 方法而不是 run() 方法

多线程在工作中多多少少会用到,启动 多线程调用的是 start() 方法,而不是 run() 方法,这是为什么呢?在探讨这个问题之前,先来了解(复习)一些多线程的基础知识~线程的状态Java 中,定义了 6 种线程状态,在 Thread 类可以找到:// 为了节约空间,我删除了注释public enum State { NEW,//初始状态 RUNNABLE,//运行状态 ...

weixin_39987926的博客 83

java多线程不启动_Java 多线程启动为什么调用 start() 方法而不是 run() 方法

多线程在工作中多多少少会用到,启动 多线程调用的是 start() 方法,而不是 run() 方法,这是为什么呢?在探讨这个问题之前,先来了解(复习)一些多线程的基础知识~线程的状态Java 中,定义了 6 种线程状态,在 Thread 类可以找到:// 为了节约空间,我删除了注释public enum State {NEW,//初始状态RUNNABLE,//运行状态BLOCKED,// 阻塞状态...

weixin_42300317的博客 338

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

多线程在工作中多多少少会用到,启动多线程调用的是 start() 方法,而不是 run() 方法,这是为什么呢?在探讨这个问题之前,先来了解(复习)一些多线程的基础知识~线程的状态Java 中,定义了 6 种线程状态,在 Thread 类可以找到:// 为了节约空间,我删除了注释public enum State {NEW,//初始状态RUNNABLE,//运行状态BLOCKED,// 阻塞状态W...

weixin_31421625的博客 210

java多线程中run()start()的区别和联系

java中Thread.start()和Thread.run()方法是什么 图片来源于《图解Java多线程设计模式》 start()方法 我们可以看到,start()方法是一个新线程开启的标志。start()方法执行任务如下: 启动新线程 将线程从New State的状态转移到Runnable的状态 开始执行run()方法 run()方法 run()方法是Runnable接口的一个抽象方法,...

weixin_44644335的博客 499

run()start()的区别

通过两个例子我们可以知道调用start方法可启动线程,可以并发,而run方法只是thread的一个普通方法调用,还是在主线程里执行。这里的意思就是说,star()方法可以异步地调用run()方法,是异步执行,直接调用run()方法是同步执行,因此也就不能达到多线程的目的。这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由jvm的内存机制规定的。并且run()方法必须是public访问权限,返回值类型为void。

m0_64421869的博客 1479

java 线程start()和run()方法的区别

Thread类中start()和run()方法的区别是: start(): 程序调用Thread类的start()方法来启动一个线程, 启动后此线程是处于就绪状态, 并没有运行。然后通过此Thread类调用该Runnable对象的run()方法来让此线程运行。(一般都会在自己程序中重写run方法来实现自己的功能。)start()方法启动线程将自动调用 run()方法,这是由jvm的内存机制规定的

岁月无痕的博客 456

start()和run()的区别

run方法是Runnable接口中定义的,start方法是Thread类定义的。 所有实现Runnable的接口的类都需要重写run方法,run方法是线程默认要执行的方法,有底层源码可知是绑定操作系统的,也是线程执行的入口。 start方法是Thread类的默认执行入口,Thread又是实现Runnable接口的。要使线程Thread启动起来,需要通过start方法,表示线程可执行状态,调用sta...

ssssaaaawe的博客 9968

java thread start 前后_Java中Thread.start()和Thread.run()之间的区别。

众所周知,start()和run()多线程处理的两种重要方法,一种用于创建新线程,而另一种用于开始执行该线程。以下是Thread.start()和Thread.run()之间的重要区别。序号键开始()()1实作线程类的start方法是在调用新线程时创建的,并且run()在该新线程中执行方法内部的代码。如果直接运行run方法,则不会创建新线程,并且内部代码run()将在当前线程上执行,并且不会发...

weixin_30545587的博客 186

Day9-Java线程中run方法start方法的区别

先看代码: package cn.itcast.algorithm.demo.three; /** * @author :caizhengjie * @description : * @date :2021/7/23 18:51 */ public class TestThread { public static void main(String[] args) { // 面试题:线程的run方法start方法的区别 Runnable task = new

蔡政洁的博客 406

start和run方法的一些问题

1.认识start()和run()方法 start() public void start() 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。 结果是两个线程并发地运行;当前线程(从调用返回给 start 方法)和另一个线程(执行其 run 方法)。 多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动。 抛出: IllegalThreadStateExce

lwgzj的博客 409

java中run()start()的区别

class NewThread implements Runnable {      Thread t;      public NewThread() {        t = new Thread(this,"Demo thread");          System.out.println("Child thread : " + t);           t.run();

Snowball 1007

Java多线程Thread及其原理深度解析

详细讲述 Java 多线程创建方式,Thread 源码解析,Thread 常用方法源码解析,非常细节,深入到看 jdk 源码

蒋大钊的博客 1339

Thread的run()与start()的区别

Java的线程是通过java.lang.Thread类来实现的。VM启动时会有一个由主方法所定义的线程。可以通过创建Thread的实例来创建新的线程。每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。通过调用Thread类的start()方法来启动一个线程 多线程原理: 相当于玩游戏机,只有一个游戏机(CPU),可是有很多人要玩,于是,star...

weixin_39590058的博客 145

Java Thread中start和run方法的区别

start() : 它的作用是启动一个新线程,新线程会执行相应的run()方法start()不能被重复调用。 run()   : run()就和普通的成员方法一样,可以被重复调用。单独调用run()的话,会在当前线程中执行run(),而并不会启动新线程! 1.start()方法来启动线程,真正实现了多线程运行。这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码;通过调用

Hello World专栏 408

点差指标(Spread Indicator) - MetaTrader 5脚本.zip

点差指标 - 在图表窗口中显示当前点差

Ecology9使用和维护相关手册.zip

泛微 Ecology9 相关使用手册,含前台操作和后台维护。

上一篇: python 内存机制_6.Python的内存管理机制
下一篇: java 无序的集合_Java集合的有序无序问题和线程安全与否问题
1984黑暗骑士
博客等级 码龄7年 25粉丝 73原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值