回顾Java多线程编程——线程生命周期

JVM源码剖析之Thread类中sleep方法 大部分的Java程序员知道让线程睡眠的方法是Thread.sleep方法,而这个方法是一个native方法,让很多想知道底层如何让线程睡眠的程序员望而却步。所以笔者特意写在这篇文章,带各位读者剖析一下Thread.sleep方法背后的神秘。sleep的底层实现并不复杂,但是不看源码是不会知道,如果传入的时间为0会优化成yield方法,并且在底层并不会像Object类中wait方法一样,释放锁资源等等~ 阅读详情

一 概述

Java内置了对多线程编程的支持,使得可以通过充分利用cpu来开发出高效率的程序。一条线程是指进程中一个单一顺序的控制流,一个进程可以并发使用多个线程,每条线程则并行执行各自的任务。

二 回顾进程

一个进程包括由操作系统分配的内存空间,含有一个或多个线程,一个线程必须是某个进程的一部分而无法独立存在,而进程会一直运行,直到所有的非守护线程都与运行结束才能结束。

三 一个线程的生命周期

线程新建状态:使用java中的new关键字和Thread类或者其子类实例化出一个线程对象后,该线程对象会处于新建状态,并且保持这个状态直到调用线程的start()方法

   
public class Thread implements Runnable { 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()方法之后,该线程就进入了就绪状态,就绪状态的线程处于就绪队列中,要等待JVM里线程调度器的调度。

运行状态:如果就绪状态的线程获取CPU资源,就可以执行run()方法,此时线程便处于运行状态。处于运行状态的线程最为复杂,它可以变为阻塞状态,就绪状态和死亡状态。

    /* What will be run. */
    private Runnable target;
    
    //Thread重写了Runnable中的run方法
    @Override
    public void run() {
        if (target != null) {
            target.run();
        }
    }

阻塞状态:如果一个线程执行了sleep(睡眠),suspend(挂起)等方法,释放当前所占用的资源之后,该线程就从运行状态进入阻塞状态。在睡眠时间已到或者获得设备资源之后可以重新进入就绪状态。

    public static native void sleep(long millis) throws InterruptedException;

    public static void sleep(long millis, int nanos)
    throws InterruptedException {
        if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException(
                                "nanosecond timeout value out of range");
        }

        if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
            millis++;
        }

        sleep(millis);
    }
    //Java1.8中该方法提示弃用
    @Deprecated
    public final void suspend() {
        checkAccess();
        suspend0();
    }

阻塞状态的几种情况:

等待阻塞:运行状态中的线程运行wait()方法时,是的该线程进入等待阻塞状态。

   [Object类中]
   public final native void wait(long timeout) throws InterruptedException;

   public final void wait(long timeout, int nanos) throws InterruptedException {
        if (timeout < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException(
                                "nanosecond timeout value out of range");
        }

        if (nanos > 0) {
            timeout++;
        }

        wait(timeout);
    }

    public final void wait() throws InterruptedException {
        wait(0);
    }

同步阻塞:线程由于同步锁被其它线程占用在获取synchronized同步锁失败。

其他阻塞:通过调用线程的 sleep() 或 join() 发出了 I/O 请求时,线程就会进入到阻塞状态。当sleep() 状态超时,join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态。

       死亡状态:   一个运行状态的线程完成任务或者其他终止条件发生时,该线程就切换到终止状态。

并发编程系列之线程之间的通信 前言 上节我们介绍了线程从创建到结束的过程,介绍了几种常见的启动和终止方法,我们知道了如何使用一个线程,那么今天我们再接下来看看1个或者多个线程之间是如何进行通信的?OK,让我们一起走进今天的并发之旅吧,祝您旅途愉快。 景点一:共享变量(volatile) 关键字volatile可以用来修饰一个共享的变量字段,使用volatile修饰的变量,当访问该变量时需要从共享内存中获取最新值,而对该变量的更新,必须同步刷新回共享内存,这样就能保证所有线程对该变量访问的可见性;结合示例代码更容易理解: p 阅读详情

相关推荐

Java零基础之多线程篇:线程生命周期

在并发编程中,多线程是一种非常重要的技术手段,理论知识及线程创建我已经在上一章节讲过了,本章我们就不再赘述。我们都知道Java作为一种广泛应用的开发语言,提供了丰富的多线程编程支持。了解并掌握Java多线程的生命周期对于编写高效且可靠的多线程程序至关重要。所以在本文中,我将介绍Java多线程的生命周期,包括线程状态的转换和对应的方法调用,作为新一期的内容进行讲解,这也是为了帮助大家学习上能够循序渐进。

喵手的博客 1255

【多线程系列】线程的状态与常用方法详解

一、线程的状态 1、线程状态,线程可以处于以下状态之一: NEW 尚未启动的线程处于此状态。 RUNNABLE 在 Java 虚拟机中执行的线程处于这种状态。 BLOCKED 被阻塞等待监视器锁的线程处于这种状态。 WAITING 无限期等待另一个线程执行特定操作的线程处于此状态。 TIMED_WAITING 等待另一个线程执行操作达指定等待时间的线程处于此状态。 TERMINATED 已退出的线程处于此状态。 一个线程在给定的时间点只能处于一种状态。 这些状态是不反映任何操作系统线程状态

王华春_Jason 1337

【Arduino 101】五分钟搞懂PID控制算法

【Arduino 101】五分钟搞懂PID控制算法物料清单尺寸接线 文章目录物料清单尺寸接线 物料清单 Arduino Uno x 1 超声波模块(HC-SR04)x 1 舵机(Tower Pro MG996R)x 1 舵机供电: 5V 稳压管(LM7805) x 1 , 滤波电容 (0.33uF, 0.1uF) x 2, 9V 电池 x 1 滑轨:泡沫板 支架:乐高 滚动物体:胶带(Up试过网球,但是测距模块的表现不理想) 尺寸 接线 ...

机器人工坊 1万+

java笔记 Object 包装类

说明 若方法有多个重载,将会省略个别的代码具体实现过程,贴出该重载的声明. 目录 Object toString()equals()hashCode()clone()getClass()finalize()notify()notifyAll()wait() 包装类 Character 0.Character 的完...

无成的博客 448

Verilog——反相器

反相器代码: module inv( A, Y );//A,Y是端口 //定义端口属性 input A; output Y; //定义输入输出关系 assign Y=~A;//Y等于A的反 endmodule //inv是module的名字

weixin_41788560的博客 9499

CloudCompare 二次开发(6)——插件中拖拽添加Qt窗口(区域生长算法为例)

手动拖拽的方式搭建Qt对话框界面的制作流程,以PCL中的点云区域生长算法为例进行制作。

点云侠的博客 2151

Java多线程--编程杂项

run与start区别 项 run() start() sleep与wait区别 wait():另见《Java并发编程之美》=>1.3 线程通知与等待 项 sleep() wait() 相同点 是否可中断 都可被中断 不同点 实际作用 暂时退出对cpu的占用 进入等待此...

IT利刃出鞘的博客 815

代谢组数据分析(二十四):基于tidymass包从质谱原始数据到代谢物注释结果的实践指南

本教程介绍了如何使用 R 语言中的 tidymass 包进行代谢组学数据分析。tidymass 是一个专为液相色谱-质谱(LC-MS)数据设计的开源工具,提供从数据准备到统计分析的全流程支持。教程详细讲解了数据准备、数据处理、数据探索、数据清洗、代谢物注释、统计分析及结果输出的步骤。用户需准备 MS1、MS2 数据和样本信息表,并通过 tidymass 进行峰识别、峰分组、保留时间校正等操作。数据处理后,用户可进行数据探索、清洗和代谢物注释,最终通过统计分析发现潜在的生物标志物,并输出结果。教程还提供了代码

专注生信领域 1635

Kotlin语言的多线程编程

Kotlin的协程为多线程编程提供了一种更加简洁、可读且高效的解决方案。通过协程,开发者能够轻松实现异步操作,管理协程的生命周期和异常处理。同时,协程能够减少不必要的资源消耗,特别是在进行大量并发操作时。在实际开发中,应该根据具体的业务场景选择合适的协程使用方式,合理设计协程的结构,以保证代码的可维护性和性能。在未来,随着Kotlin不断发展,协程将会在更多领域发挥重要作用,为开发者提供更好的编程体验。

2501_90359424的博客 572

电商平台系统需求规格说明书(示例)

​​电商系统​​:指本文件所描述的集商品展示、销售、支付、物流跟踪、用户管理等功能于一体的综合性在线购物平台。​​API​​:应用程序编程接口(Application Programming Interface),用于实现系统各模块之间或与外部系统之间的数据交互和功能调用。

跟佟格湾一起学习计算机知识吧~ 1262

进阶01:Labview与OPC UA设备通信

LabVIEW通过OPC UA实现高效设备通信方案 本文介绍了使用LabVIEW与OPC UA设备通信的完整实施方案。OPC UA协议具有跨平台兼容、高安全性和高效数据交换等优势。实施步骤包括:1)安装NI OPC UA工具包;2)搭建模拟测试环境,使用OPC UA Simulation Server创建测试变量;3)编写LabVIEW程序,实现连接服务器、事件订阅、数据读写等功能。重点展示了通过用户事件实现设备主动触发的机制,当模拟变量值改变时自动触发LabVIEW事件处理。该方案验证了OPC UA在工业

weixin_38637405的博客 1400

阶段二-Day05-线程的生命周期

1、如果能获取锁,线程就从 WAITING 状态变成 RUNNABLE(可运行) 状态;2、否则,线程就从 WAITING 状态又变成 BLOCKED(等待锁) 状态。

m0_59163770的博客 89

光电二极管探测器电流信号处理与指令输出系统

本文提出了一种基于Python的光电二极管电流信号处理系统设计方案。该系统能够实时采集、处理光电二极管输出的电流信号,并根据预设阈值输出控制指令。系统采用模块化架构,包含数据采集、信号处理、阈值检测、指令生成等核心模块。其中数据采集模块提供了模拟器实现和硬件接口框架,支持噪声模拟和脉冲信号生成。系统设计考虑了实时性、可靠性和可扩展性,适用于光强测量、光电检测等多种应用场景。

huanghm88的专栏 1180

二—17:JUC_锁_信号量_并发集合

在Java中每个对象或类都可以当做锁使用,这些锁称为内置锁。Java中内置锁都是互斥锁。也就是说一个线程获取到锁,其他线程必须等待或阻塞。如果占用锁的线程不释放锁,其他线程将一直等待下去。锁在同一时刻,只能被一个线程持有。如果锁是作用于对象,称对象锁。如果锁作用整个类称为类锁。synchronized是Java中的关键字。使用synchronized关键字是锁的一种实现。synchronized的加锁和解锁过程不需要程序员手动控制,

qq_51318621的博客 184

2025年下半年网络工程师案例分析真题及答案解析

2025年下半年网络工程师案例分析真题及答案解析

鹿鸣天涯 1086

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

2024年8月12日京东Android开发工程师一面面经,字节跳动正式启动2024届秋季校招

针对于上面的问题,我总结出了互联网公司Android程序员面试涉及到的绝大部分面试题及答案,并整理做成了文档,以及系统的进阶学习视频资料。(包括Java在Android开发中应用、APP框架知识体系、高级UI、全方位性能调优,NDK开发,音视频技术,人工智能技术,跨平台技术等技术资料),希望能帮助到你面试前的复习,且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。

pCITv1C的博客 811

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

面向对象的特征?含义和好处

面向对象的三个基本特征是:封装、继承、多态。 优点:易维护,质量高,效率高,易扩展。 1 面向对象中多态包括哪几个方面? 答:多态包括方法的重载和重写,方法的重载是在同一个类中有多个同名方法,但方法的参数个数或参数类型不同;方法的重写是指子类在继承父类时,重写父类的同名方法。包括方法名,返回值类型,参数类表。 2 Java中怎样实现多线,怎样启动线程,在线程并发执行时要考虑什么问题? 答:Java 中一个类继承Thread类或实现Runable 接口,并重写run方法。即可实现多线程。调用st

Java 393

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

揭秘,面试资料分享

今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司19年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。还有。

2401_83329718的博客 875

Java基础回顾系列-第四天-高级编程之多线程编程

多线程编程Java多线程编程进程、线程概念线程常用操作方法线程的同步与死锁综合实战:“生产者-消费者”模型多线程深入话题多线程综合案例 Java多线程编程 进程、线程概念 进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线程不能独立的存在,它必须是进程的一部分。一个进程一直运行,直到所有的非守护线程都结束运行后才能结束。 线程常用操作方法 线程的同步与死锁 综合实战:“生产者-...

java 603

49天精通Java(Day 17):多线程编程基础

🏆本文收录于专栏,专业攻坚指数级提升持续更新中,up!up!up!!

**My Coding Family** 1393

多线程生命周期——JAVA

多线程生命周期——JAVA生命周期小结 生命周期      下面是根据线程之间状态的转换来描述线程的生命周期.      线程的生命周期有:新建.就绪.阻塞.运行.死亡.五个状态 新建      通过New关键字就可以新建一个线程 就绪 &nbs...

BXA 534

Java多线程初阶-基础概念与线程操作

本篇笔记介绍了JavaEE中的重要一站,理解和掌握多线程是提升程序性能、构建高响应应用的关键。这篇文章可以作为多线程学习之旅的起点,旨在帮助初学者建立对线程的清晰认识。内容将从“什么是线程”这个基本问题出发,探讨其与进程的区别,并动手编写第一个多线程程序。接着,会深入学习`Thread`类的常用方法,掌握如何创建、启动、中断和等待一个线程。最后,会全面解析线程的生命周期与各种状态,为后续理解更复杂的并发问题打下坚实的基础。

weixin_73966418的博客 1357

并发编程(一)多线程基础和原理

多线程基础 最近,准备回顾下多线程相关的知识体系,顺便在这里做个记录。 并发的发展历史 最早的计算机只能解决简单的数学运算问题,比如正弦、 余弦等。运行方式:程序员首先把程序写到纸上,然后穿 孔成卡片,再把卡片盒带入到专门的输入室。输入室会有 专门的操作员将卡片的程序输入到计算机上。计算机运行 完当前的任务以后,把计算结果从打印机上进行输出,操 作员再把打印出来的结果送入到输出室,程序员就可以从 输出室取到结果。然后,操作员再继续从已经送入到输入 室的卡片盒中读入另一个任务重复上述的步骤。 操作员在机

leon 4374

【Java多线程】10 Java 并发编程的最佳实践

通过将对象的状态设为不可更改,可以避免数据竞争和不一致的状态。使用线程池时,合理配置线程池的大小,可以有效提高并发性能。根据任务的性质和系统的资源状况来选择合适的线程池类型(如固定大小、可缓存等)。通过分析 CPU 和内存的使用情况、线程的活跃度等,找出性能瓶颈并进行优化。Java 提供了丰富的并发工具和类,尽量使用这些已有的并发类,而不是自己实现复杂的同步逻辑。长时间持有锁会降低并发性能,尽量将锁的持有时间缩短,避免在持有锁时执行耗时操作。在设计并发系统时,选择合适的锁策略非常重要。

A1924的博客 1276

多线程回顾-01

好久没法推文了,因为这次疫情的原因,小编也是没能去上学,已经待在家好一阵了,一直想写下推文,但是不知道些什么,看了看之前的板块,我打算先把砌砖系列先完善一下,所以今天先和大家回顾一下Java多线程的一些基础知识,并演示一下我写的一些程序。 多线程部分我打算分两个部分:第一部分介绍多线程的基本概念及线程如何构造,第二部分我们介绍多线程之间存在的问题及处理方式。 接下来,我们进入今天的正题–多线程的基本概念及线程如何构造 说到多线程,不得不先说下多进程,进程和线程虽一字之差,但是是不同的概念。我们先给出进程和线

weixin_38647056的博客 223

Java— 齐头并进完成任务—多线程

感知多线程 Java是少数的几种支持“多线程”的语言之一。大多数的程序语言只能循序运行单独的一个程序块,无法同时运行不同的多个程序块。Java的“多线程”恰可弥补这个缺憾,它可以让不同的程序块并发执行,如此一来就可让程序运行得更为顺畅,同时也可达到多任务处理的目的。 现实生活中的多线程 任何抽象的理论(本质)都离不开具体的现象。通过现象比较容易看清楚本质,在没有讲解Java的多线程概念之前,我们先从现实生活中体会一下“多线程”。 在高速公路收费匝道上,经常会看到排成长龙的车队。如果让你来缓解这一拥塞的交通状

LiLi的博客 1431
上一篇: AES加密在Linux操作系统上每次加密之后的值会不同
下一篇: 单独启动线程与使用线程池的区别
至学者
博客等级 码龄9年 180粉丝 773原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值