线程启动详解

ArcGIS中的Python入门知识点整理 关于Arcpy大家应该都比较熟悉,Python用的好,数据处理快又好!在ArcGIS中ArcPy是一个以成功的arcgisscripting模块为基础并继承了arcgisscripting功能进而构建而成的站点包。目的是为以实用高效的方式通过Python执行地理数据分析、数据转换、数据管理和地图自动化创建基础。ArcPy提供了丰富纯正的Python体验,具有代码自动完成功能。今天我们就看看关于Arcpy相关处理的使用,通过一些简单代码与大家一起认识Arcpy。 阅读详情

一、start()和run()

这两个方法是在开发中实现多线时,最常接触的方法,start()是线程启动的方法,run()是线程中具体要实现的业务逻辑,这两个方法有直接的联系,但又是两个完全不同的方法,start()用来启动一个新的线程,而启动的新的线程主题逻辑就是run()。这两个方法不能孤立存在,只有start()不产生任何现实意义,只有run()不会创建新的线程。

实例代码:

public class StartAndRunMethod {
    public static void main(String[] args){
        Runnable runnable = () -> {
            System.out.println(Thread.currentThread().getName());
        };
        /**
         * 直接调用run方法是直接通过主线程来执行的,
         * 这肯定是不符合我们的本意,我们是准备新建一个线程执行的;
         * */
        runnable.run();
        /**
         * 通过新建子线程进行执行的;
         * */
        new Thread(runnable).start();
    }
}

二、start()方法的作用:

1、启动新的线程:

start()通知jvm在空闲的情况下启动新线程,所以说启动一个新线程的本质就是请求jvm来运行我们的线程,对于这个线程何时可以运行,并不是由我们决定的,而是说线程调度器决定。所以start执行之后,子线程并不一定会运行,它可能稍后才会运行,可能很长时间都不被运行,比如遇到了饥饿的情况;

2、线程执行前的准备工作:子线程运行之前的准备工作,包含:让子线程处于就绪状态(已经设置了上下文,栈,线程状态,以及PC(寄存器)),处于等待CPU的状态;做完准备工作之后,我们的线程才能被jvm或操作系统进一步调度到执行状态,调度到执行状态,等待获取cpu资源,然后才能真正的进入到运行状态,执行run方法里面的那些代码。

3、不能重复start();重复调用start()会报java.lang.IllegalThreadStateException异常,因为在调用start()的时候会先判断Thread状态,也就是threadStatus 是否为0,如果不为0,也就是线程已经启动过了,就直接抛IllegalThreadStateException异常。

源码:

/* Java thread status for tools,
 * initialized to indicate thread 'not yet started'
 */

private volatile int threadStatus = 0;

从start()源码可以看出,线程的启动要经过:

1、检查新新线程状态,验证线程是否尚未启动(threadStatus是否为0 );

2、加入线程组;

3、调用start0()通知jvm启动线程;

/**
 * Causes this thread to begin execution; the Java Virtual Machine
 * calls the <code>run</code> method of this thread.
 * <p>
 * The result is that two threads are running concurrently: the
 * current thread (which returns from the call to the
 * <code>start</code> method) and the other thread (which executes its
 * <code>run</code> method).
 * <p>
 * It is never legal to start a thread more than once.
 * In particular, a thread may not be restarted once it has completed
 * execution.
 *
 * @exception  IllegalThreadStateException  if the thread was already
 *               started.
 * @see        #run()
 * @see        #stop()
 */
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();

    /* 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);

    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 */
        }
    }
}

实例代码:

/**
 * 描述: 测试如果两次执行start方法会怎么样
 *
 * **/
public class CantStartTwice {

    public static void main(String[] args) {
        Thread thread = new Thread();
        thread.start();
        thread.start();
    }
}

三、Run()源码:

/* What will be run. */
private Runnable target;
/**
 * If this thread was constructed using a separate
 * <code>Runnable</code> run object, then that
 * <code>Runnable</code> object's <code>run</code> method is called;
 * otherwise, this method does nothing and returns.
 * <p>
 * Subclasses of <code>Thread</code> should override this method.
 *
 * @see     #start()
 * @see     #stop()
 * @see     #Thread(ThreadGroup, Runnable, String)
 */
@Override
public void run() {
    if (target != null) {
        target.run();
    }
}

如果通过Runnable方法创建线程,将传入的对象赋值给target,调用Thread提供的run(),通过继承Thread实现,重写run(),执行子类重写的run();

逆向工程实战:解密AppleAccount的X-MMe-Nas-Qualify签名生成机制 本文通过逆向工程实战,详细解析了AppleAccount服务中X-MMe-Nas-Qualify签名的生成机制。作者利用Frida进行动态追踪定位签名源头,结合IDA Pro进行静态分析,并借助LLDB动态调试还原核心算法。文章最终分享了如何独立于苹果官方库,通过Python代码复现签名算法,为自动化测试和深度交互苹果服务的开发者提供了关键技术路径。 阅读详情

相关推荐

解码运动想象:BCI Competition IV 2a数据集实战指南

本文提供了BCI Competition IV 2a数据集的实战指南,详细解析了该经典运动想象脑电数据集的结构、文件格式与实验范式。通过MNE-Python等工具,逐步演示了从原始信号读取、预处理(通道选择、滤波、分段)到特征提取(CSP、频带功率)和模型训练(LDA、SVM)的完整流程,并强调了受试者独立评估的重要性,为BCI研究者提供了可复现的入门与进阶路径。

weixin_29304985的博客 362

启动线程的三种方式

文章目录前言一、启动线程的第一种方法:继承类二、启动线程的第二种方式:实现接口三、启动线程的第三种方式:匿名内部类 前言 启动线程一共有三种方法:继承类,实现接口,匿名内部类。 一、启动线程的第一种方法:继承类 start()方法的作用是启动一个分支线程,在JVM中开辟一个新的栈空间。 只要新的栈空间,myThread.start()瞬间就结束了,线程就启动成功了。 启动成功的线程会自动调用run方法,并且run方法在分支线的栈底部。 代码如下(示例): public class Thread01 .

qq_44705164的博客 2万+

LT9211 单路mipi转双路mipi芯片,方案成熟,提供技术支持

LT9211 单路mipi转双路mipi芯片

TEL15012949045的博客 5013

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

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

云泽野の编程日记 3347

电流模架构Bandgap设计与仿真

带隙基准作为集成电路中一个重要模块,被广泛应用在低压差线性稳压(LDO)、充电电池保护芯片和通信电路、射频收发器、flash存储器等多种模拟及数模混合集成电路中,并且是片上集成系统(SOC)芯片中不可或缺的部分,为整个芯片提供精确的电压参考点............

qq_50968231的博客 5万+

Dify视觉模型节点避坑指南:我用Qwen2.5-VL做OCR识别时踩过的3个坑(及解决方案)

本文分享了使用Dify平台和Qwen2.5-VL视觉模型进行OCR票据识别时遇到的三个常见问题及解决方案,包括文件变量传递、结构化输出和条件分支判断失效。通过实战经验,帮助开发者优化多模态模型在财务自动化中的应用,提升OCR识别精度和效率。

weixin_29284885的博客 402

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

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

weixin_68105699的博客 4337

EtherCAT主站SOEM -- 24 -- 基于STM32F767IGT6搭建自己的SOEM-EtherCAT主站

以上就是EtherCAT主站SOEM – 23 – 基于STM32F767IGT6搭建自己的SOEM-EtherCAT主站的内容。有不明白的地方欢迎留言;有建议欢迎留言,我后面编写文档好改进。创作不容,如果文档对您有帮助,记得给个赞。

常驻客栈的博客--嵌入式EtherCAT 3551

线程的启动

线程的启动 1. 线程与进程 ​ 进程:进程就是在系统中允许的一个个程序,例如QQ.exe 这种就是一个进程。进程是资源拥有的单位。 ​ 线程:线程是进程中的一个执行流程,就像你使用QQ音乐一边听歌一边浏览歌单一样。线程是CPU进行调度的单位。 1.1 为什么会有线程? ​ 在系统运行时,CPU会根据时间片来运行各种程序,譬如每个程序执行0.1ms,然后切换到下一个调度单位执行。在最开始的时候是只有进程,CPU调度的单位也是进程,但是发现在CPU时间片切换导致进程的上下文切换时,需要将前一个进程的虚拟内存、

程序猿小河 518

2026年医疗AI的可信革命全栈实现(上)

医疗AI可信化:贝叶斯网络与向量数据库的协同架构 本文探讨2026年医疗AI发展的关键转折点——从追求生成能力转向构建可信决策系统。核心观点认为,医疗AI下一阶段的竞争焦点在于不确定性量化和错误传播约束,而非单纯的问答流畅度。研究提出以Python为开发语言、结合向量数据库与贝叶斯网络的混合架构: 技术分层 语言层(LLM):处理自然语言交互与工具调用 证据层(Milvus/Qdrant):实现可审计的临床知识检索 概率层(pgmpy/PyMC):执行贝叶斯推理与风险路由 治理层:确保权限控制与人工复核机制

AllenLV的博客 1149

图像拼接(Image Stitching)

图像拼接(Image Stitching):是一项计算机视觉技术,它将多张重叠的图像合并为一张更大、无缝的全景图或广角视图。该技术广泛应用于全景摄影、地图制作、医学影像处理、计算机视觉及增强现实(AR)等领域。

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 2504

深入理解Java线程:run 与 start 方法的区别

通过以上分析和示例,我们可以清楚地看到run方法和start方法之间的区别。start方法是多线程编程的核心,它启动一个新线程并使得线程的运行与其他线程并行进行。而直接调用run方法则仅仅是在当前线程中顺序执行run方法中的代码,不会产生新的线程执行流。掌握这两个方法的区别对于使用Java进行多线程编程非常重要,它可以帮助我们更好地设计程序结构,充分利用多线程带来的并行处理能力。

努力上进!!加油加油!! 832

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【多线程系列】线程的创建与启动详解

一、创建线程 下面两种方式相信一定非常的熟悉,这是我们常用的方式,下面就以它开头,对线程的创建和启动做一个详细的分析。也是希望通过分析这个过程来理解多线程。 1、继承Thread的方式创建线程 public class ThreadTest extends Thread { public void run(){ System.out.println("重写run方法"); } public static void main(String[] args) {

王华春_Jason 1248

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【线程】线程启动方法详解

Java线程启动机制解析:Thread.start()方法通过调用native方法start0()请求操作系统创建原生线程(如Linux的pthread_create或Windows的CreateThread),将线程状态设为就绪态。start0()由JVM底层C/C++实现,负责线程对象与系统线程的绑定。注意调用start()后线程进入可运行状态,实际执行时机由CPU调度决定,而非立即执行。方法包含线程状态检查(threadStatus!=0时抛出异常)和线程组管理逻辑,确保线程创建过程的可靠性。

2301_78725423的博客 121

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

openGauss 多线程架构启动过程详解

目录 openGauss为什么要使用多线程架构 openGauss主要线程有哪些 openGauss启动过程 gs_ctl启动数据库 PostmasterMain函数 ServerLoop函数 PostgresMain函数 思考如何新增一个辅助线程 openGauss数据库是一个单进程多线程的数据库,客户端可以使用JDBC/ODBC/Libpq/Psycopg等驱动程序,向openGauss的主线程(Postmaster)发起连接请求。 openGauss为什么要使用多线程架构.

Gauss松鼠会 4152

Java多线程系列 - 如何启动一个最简单的多线程?代码详解

多线程的启动  在Java中我们实现多线程有三种方法,他们分别是: 继承Thread 类进行实现 实现Runnable接口进行实现 通过 Callable 和 Future 创建线程。 接下来就让我们来进行多线程启动的代码详解 代码详解 继承Thread类 /*继承Thread类,来实现多线程*/ class MyThread extends Thread{ /* * 重写其 run 方法 * */ @Override public void run() {

一个编程爱好者的博客 516

Windows线程启动和消亡详解

线程的创建:前提条件,线程的创建是在某一个进程当中调用CreateThread()创建一个线程。 线程的创建: No.1:创建内核对象。 1.使用计数:设置使用计数+1,当一个线程被创建的时候,线程内核的使用计数会加1. 2.暂停计数:设置暂停计数,这个参数是一个UINT 类型的,这就代表着这个线程可以被多次的暂停。当一个线程被创建出来的时候,暂停计数是1的状态,只有当暂停计 数

qq_21441793的博客 1378

Java多线程系列详解_01_线程的创建和启动

本文主要讲线程的两种创建方式以及启动线程线程的释义(What)为什么要有线程(Why)线程的创建方式线程的启动 线程的释义(What) 百度百科如下: 为什么要有线程(Why) 在Java中很多文件IO操作和网络IO操作都是比较耗时的,比如下载10个文件到本地,这时一般的程序会一个一个 文件的下载,加入使用多线程操作会将10个文件同时下载,这个时候会节省好多时间. 本文的例子是读取数据库内容并写入本地文件,话不多说,让我们一起看代码吧! 线程的创建方式 未使用多线程之前 /** * @a

Alone5256的博客 312

详解openGauss多线程架构启动过程

本文介绍openGauss数据库的启动过程,包括主线程,辅助线程及业务处理线程的启动过程。

华为云官方博客 2214

详解c#中启动后台线程函数BackgroundWorker();

BackgroundWorker 可以用于启动后台线程。 主要的事件及参数:   1.DoWork——当执行BackgroundWorker.RunWorkerAsync方法时会触发该事件,并且传递DoWorkEventArgs参数;   2.RunWorkerCompleted——异步操作完成或中途终止会触发该事件。 如果需要提前终止执行后台操作,可以调用BackgroundWorker

ghevinn欢迎您光临 1800

任务加入线程池是的生效和启动过程详解

前言 很早之前我就写过两篇关于线程池的博客, 但是这两篇博客的认识比较浅陋, 有很多需要订正的地方, 所以我决定新开一篇博客. https://blog.youkuaiyun.com/leisurelen/article/details/107872827 https://blog.youkuaiyun.com/leisurelen/article/details/107872827 在这里我先简单描述下线程池的工作流程 加入一个Task, 如果没有达到核心线程数, 启动一个新Worker执行这个Task 再加入一个Task

之城的专栏 3226

线程(一)OpenJDK 17 中线程启动的完整流程用C++ 源码详解

这一流程涵盖了从操作系统线程创建到执行 Java 代码的全链路,涉及 JVM 内部状态管理、同步机制、性能优化及跨层级调用,是 JVM 线程模型的核心实现。

u014200244的专栏 849

多线程-启动线程的几种方式以及Thread类方法详解

线程之间的执行是相互独立的,哪一个线程优先执行取决于OS的调度 线程的创建方式: 实现Runnable接口: 创建自定义类并实现runnable接口,且实现接口中的run方法; 实例化自定义的类; 将自定义类的实例作为参数传给Thread类,创建thread实例; 调用thread实例的start,启动子线程; 普通方式 package ThreadDemo; class Thread1 i...

Fly_Fly_Zhang的博客 1984

java 启动线程的方式 3种方式详解

课程素材来自 http://enjoy.ke.qq.com/    版权所有java 启动一个线程  最常见的方式有2种(继承thread  实现runnable接口),其实还有另外一种方式,是实现Callable接口前面两种方式不说了  强调一下 runnable比thread好的方面是java是单继承  多实现的 ,所以个人认为runnable比thread好这里主要说callable接口  ...

pf1234321的专栏 658

易语言linux支持多线程,详解易语言启动多线程

用易语言写多线程应用要么使用多线程相关的api,支持库或模块,其实那些支持库或模块也都是封装的api,但是要比api使用方便。总体来说易语言官方的多线程支持库要比一些杂七杂八的模块好多了。支持库勾选上之后就可以使用易语言的多线程支持库了。首先看用易语言多线程支持库创建线程的命令:启动线程:命令名:启动线程创建并启动一条线程,可重复使用以创建多条线程,成功返回真,失败返回假。参数数据类型说明参数&l...

weixin_35935514的博客 1192
上一篇: 实现多线程方法详解
下一篇: 封装一个自定义ArrayList
咕咚走了
博客等级 码龄9年 1粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值