(1)Java并发编程基础篇

进程和线程 一、进程和线程 进程 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。在 Java 中,当启动 main 方法时其实就是启动了一个 JVM 的进程,而 main 方法所在的线程就是这个进程中的一个线程,称为主线程。 进程是资源分配的基本单位。每一个进程都有它自己的内存空间和系统资源。 线程 线程与进程相似,但线程是一个比进程更小的执行单位,是进程中的单个顺序控制流,是一条执行路径。 一个进程如果只有一条执行路径,则称为单 阅读详情

什么是线程

CPU调度的最基本单位。

线程创建与运行

线程的创建有三种方式

  1. 通过继承Thread类覆盖run方法

  2. 实现runnable接口

  3. 实现Callable接口,此方式能够获取任务执行完毕的返回结果

线程通知与等待

  1. wait方法

当一个线程调用共享变量的wait函数时,该线程会阻塞挂起并释放共享变量的锁. 线程的唤醒需由其他线程通过调用共享变量的notify方法或notifyAll方法。但有可能存在虚假唤醒的情况,所以程代码的一般写法都是如下,以保障程序的健壮性.

synchroized(shareVariable){
    
    while(quque.size() == MAX_SIZE){
        // 阻塞挂起
        shareVariable.await();
    }
    
}

     2. wait(long timeout)方法

线程调用共享变量的wait(long timeout),在指定timeout时间内如果没其他线程调用共享变量的notify或notifyAll方法,该线程将会因为超时而自动唤醒。需要注意的是 timeout=0 和不传入参数时方法功能时相同的,timeout=-1将会抛出IllegalArgumentsException异常。

     3. notify()方法

该方法会随机唤醒一个因调用共享变量wait方法而挂起的线程,唤起的线程会继续开始和其他线程争抢共享变量的监视器锁.

     4. notifyAll()方法

该方法则会唤醒全部因调用共享变量wait方法而挂起的线程,让所有的线程继续争抢共享变量的监视器锁。

     5. Thread的join方法

A线程调用了B线程的join方法时,A线程将会阻塞挂起,等待B线程任务结束唤醒它继续执行。

     6. Thread的sleep方法

线程调用此方法之后会进入休眠状态,出让CPU执行权,只有等到指定睡眠时间过后,才会继续参与CPU调度。需要注意的是:该线程锁持有的共享变量监视器锁资源仍然是不释放的。

     7. yield方法

线程会出让CPU执行权,并处于就绪状态,等待CPU调度器分配下一轮时间片。

     8. 线程中断

线程的中断并不是终止线程的执行,而是通过设置中断标志位,让被中断的线程根据中断标志位自行处理。

  • interrupt()

对线程进行中断操作,只是设置了线程中断的标志位,线程仍然能够继续执行。需要注意的是对于阻塞挂起的线程如果调用了中断操作将会抛出IntteruptedException异常

  • isInterrpted()

检测线程是否被中断(线程是否设置了中断标志位)

  • interrupted()

检测线程是否被中断,此方法与isInterrpt()不同之处在于:interrupted为Thread的静态方法、调用之后会清除中断标志位,isInterrpt调用之后并不会清楚中断标志位。

应用场景:

线程为了等待某些资源调用sleep方法让其进行阻塞挂起30s,但是等待的资源早在2s内就完成了。如果一直等到30s再返回有点浪费时间,这时就可以调用该线程的interrupt方法,抛出异常让线程恢复到激活状态。

上下文切换

当线程将CPU分配的时间片用完之后,会处于就绪状态等待和其他线程继续竞争CPU资源来进行下次的执行,此步骤就是上下文切换。为了保证线程下次分配到CPU时间片继续执行,所以线程上下文切换的时候需要保存执行现场。

守护线程和用户线程

主线程执行完毕后, 如果存在用户线程,那么JVM进程是不会结束。

主线程执行完毕后,如果只存在守护线程,那么JVM进程会立马结束。

主线程也是用户线程

Java并发编程-基础篇 1. JVM与线程安全 可见性:当多个线程对一个线程进行操作的时候,其中一个线程修改了变量的值,而其他的线程并不知道该值已经被修改 可见性-synchronized JMM关于synchronized的两条规定: 1、线程解锁前,必须把共享变量的最新值刷新到主内存 2、线程加锁时,将清空工作内存中共享变量的值,从而使用共享变量时需要从主内存中重新读取最新的值(注意:加锁与解锁是同一把锁) 可见性-... 阅读详情

相关推荐

Java并发编程基础小结

并发编程的核心问题与解决方案 本文从多线程的必要性、优势入手,深入分析了并发编程需要关注的三大核心问题:安全性问题(如数据竞争)、活跃性问题(如死锁、活锁)以及性能问题(如线程切换开销)。作者通过生动的代码示例和图示,展示了在多线程环境下可能出现的典型问题,并指出JVM中线程与进程的资源分配差异。文章还解释了程序计数器、虚拟机栈等线程私有区域的设计原理,以及如何利用"栈封闭"技术解决线程安全问题。全文为Java开发者提供了对并发编程本质问题的系统性思考框架。

禅与计算机程序设计的艺术 1616

Java之并发编程基础

并发指的是系统中多个任务(线程)在同一时间段内交替执行。它允许多个任务在逻辑上同时进行,但在实际的单核处理器上,这些任务是通过时间分片的方式交替执行的。并行指的是在同一时刻有多个任务在不同的处理器核上同时执行。它利用多核处理器的能力来同时执行多个任务,以提高执行效率。

m0_54063422的博客 1538

《Java并发编程之美》阅读笔记

简介 最近在阅读《Java并发编程之美》这本书,为了督促自己啃完这本书,计划每读完一章写一篇阅读笔记,供以后参考 笔记列表 第一部分 Java并发编程基础篇 第1章 并发编程线程基础 第2章 并发编程的其他基础知识 第二部分 Java并发编程高级篇 第3章 Java并发包中的ThreadLocalRandom类原理剖析 第4章 Java并发包中原子操作类原理剖析 第5章 J...

weixin_43809177的博客 1699

Java并发编程: 第一章 并发编程基础

主存:主要存储的是Java实例对象,所有线程创建的实例对象都存放在主存中,无论该实例对象是成员变量还是方法中的本地变量(也称局部变量),当然也包括共享的类信息、常量、静态变量。由于是共享数据区域,因此多条线程对同一个变量进行访问可能会发现线程安全问题。

玉汝于成 1557

Java并发编程之美

一、前言 并发编程相比 Java 中其他知识点学习门槛较高,从而导致很多人望而却步。但无论是职场面试,还是高并发/高流量的系统的实现,却都离不开并发编程,于是能够真正掌握并发编程的人成为了市场迫切需求的人才。本书将通过图文结合、通俗易懂的方式帮助大家完成多线程并发编程从入门到实践的飞跃! 本书分为三部分: - 第一部分Java并发编程基础篇主要讲解Java并发编程的基础知识,主要讲解线程有关...

加多的博客 5735

矩阵束(Matrix Pencil)入门:从通信系统到控制理论,它为何是建模利器?

本文深入探讨矩阵束(Matrix Pencil)在通信系统与控制理论中的关键作用,揭示其作为复杂系统建模利器的独特价值。从MIMO系统的多径干扰分析到电力系统稳定性判据,矩阵束通过`A-λB`方程求解提供精准建模方案,显著提升5G通信和工业控制等领域的性能表现。

weixin_30134145的博客 359

sleep不会释放锁,但是会让出cpu执行权

A线程调用sleep方法不会释放锁,所以其它和A线程一起持有一把锁的A1、A2线程就不会执行,但是另外的线程不需要持有这把锁的线程是可以被cpu执行的,例如主线程,B1、B2线程。 sleep和wait方法的区别就是sleep不会释放锁,当睡眠的时间到了之后,线程会自动进入可执行状态,等待cpu的执行。而wait方法会释放锁(所以前提就是线程在执行wait方法之前必须要获得锁,也就意味着只能在同步方法或者同步代码块中调用wait方法),释放锁之后,必须要有另外线程执行notify或者notifyA.

tangzongyuan的博客 7023

UE4引擎分析获取UWord,GName,GetName,GObjectArray

UE4引擎具有很多固定特征和特性 所以我们在逆向UE4引擎开发的游戏的时候,可以利用这些特征和特性. 当然,正常思路逆向也是没问题的(例如我们的ttw课程全数据逆向),你就当多了一个针对于该引擎逆向的快捷方式 或则多了一个思路即可. 正常逆向+引擎分析,使逆向结果全面且快速.

任鸟飞2217777779的博客 1万+

深入理解java并发编程、并发编程相关概念基础篇1

一、前言 Come on, let’s all come together 不知道各位小伙伴在对于并发编程相关的知识有了解多少呢?无论你是小白还是大牛、我这篇文章希望对你们有所帮助~~~ 以下是我耗费好几天整理的文章的部分。 主要分为俩大部分进行学习:分为基础篇以及进阶篇,下面就开始基础篇的学习。 二、并发编程的相关概念 2.1.同步(Sync)与异步(Async) 2.2.1 同步(Sync)...

q309556032的博客 172

Python+Appium实现泛微OA自动打卡:5分钟搭建移动端自动化脚本

移动端自动化测试是软件测试与办公自动化领域的重要技术方向,其核心原理是通过程序模拟用户对手机应用界面的操作,实现重复性任务的自动执行。Appium作为主流的开源移动端自动化框架,基于WebDriver协议,支持跨平台且无需修改被测应用,为自动化脚本开发提供了标准化接口。在工程实践中,结合Python简洁的语法和丰富的生态,可以快速构建稳定可靠的自动化解决方案。这一技术组合的价值在于能够高效处理“重复性、低价值、高频率”的日常操作,例如考勤打卡、数据填报等办公场景,显著提升工作效率。本文以泛微OA Emobi

weixin_28836875的博客 390

国产麒麟系统各版本镜像下载

以上各链接均为迅雷下载,禁止商业用途!

2302_79474754的博客 6134

黑马程序员Java面试专题(2)|并发编程篇(1)线程基础

指路👉黑马程序员Java面试专题(1)|常见集合篇(1)ArrayList&LinkedList-优快云博客黑马程序员Java面试专题(1)|常见集合篇(2)HashMap-优快云博客。

YOYU_的博客 1229

基于 STM32 的手持式安检金属探测器设计与实现

【代码】基于 STM32 的手持式安检金属探测器设计与实现。

weixin_42300449的博客 900

JAVA八股文面试必会-基础篇-1.3 并发编程

CPU密集的意思是该任务需要大量的运算,而没有阻塞,CPU一直全速运行CPU密集任务只有在真正的多核CPU上才可能得到加速(通过多线程),而在单核CPU上,无论你开 几个模拟的多线程,该任务都不可能得到加速,因为CPU总的运算能力就那样。

lky20011016的博客 351

【Simulink教程案例19】基于simulink的扩频通信系统建模与仿真

扩频是一种应用于数字调制信号的调制技术,可以提高传输信号的带宽。扩频通信具有抗干扰能力强,扩频增益越大,抗干扰能力越强。而且扩频通信具有很强的保密性,扩频后信号近似白噪声,功率谱密度也很低。扩频通信可用于多址通信。扩频调制有如下三个特点:① 扩频后信号的带宽远大于信号所需的带宽② 使用扩频码进行扩频调制,扩频码与信号中的数据相互独立③ 在接收端,通过将接收信号与扩频码的同步副本进行相关,实现解扩。

FPGA/MATLAB学习教程/源码/项目合作开发 2197

SOI LDMOS器件的Sentaurus TCAD建模与关键电学特性仿真研究

本文研究了SOI LDMOS器件的TCAD建模与电学特性仿真。通过Sentaurus TCAD平台建立了单RESURF结构的SOI LDMOS模型,详细阐述了器件结构原理和RESURF耐压机制。研究采用SDE进行几何定义和掺杂配置,在Sentaurus Device中构建了完整的物理模型体系,包括迁移率、复合和碰撞电离模型。通过系统仿真提取了器件的转移特性、输出特性和击穿特性等关键参数,分析了各参数对性能的影响规律。研究结果为功率半导体器件的仿真建模提供了规范化参考,有助于优化SOI LDMOS的性能设计。

huanghm88的专栏 134

多线程学习参考资料

基础篇:http://blog.youkuaiyun.com/axman/article/category/894627   上面的网络资料中并没有说到java.util.concurrent中的内容,但是文章写得通俗易懂。   高级篇:http://www.blogjava.net/xylz/archive/2010/07/08/325587.html   高级篇主要介绍了JDK1.5之后的并发...

霜怜一叹 124

dji psdk开发 关于SDK认证芯片的使用

Payload SDK V3.10.0 于 2025-1-8 发布,增加了 Matrice 4T/4E 机型支持,同时也增加了 DJI SDK 认证芯片(DJI SDK CC)功能支持。关于认证芯片的介绍大疆 SDK 认证芯片(DJI SDK Certified Chip),简称 DJI SDK CC,用于认证基于 DJI Eport/Eport-Lite 接口开发的第三方负载设备,确保设备能够正常工作并与无人机可以进行有效通信,起到负载安全认证和功能授权的作用。

热爱生活,忠于自己 2146

《2026全新 | Java 100 天进阶之路:从零基础到上岗就业,108篇完整学习地图》

摘要:不背八股文,不堆概念。44篇基础 + 64篇进阶(共108篇),100天助你达到Java就业水平,从容面对技术面试。 👉 零基础入门 / 校招社招突击 / 1-3年Java后端提升 / 想系统复盘全栈知识的开发者。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 1万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

01 - Java并发编程与高并发解决方案笔记-基础篇

01 - Java并发编程与高并发解决方案笔记-基础篇 基础篇很重要!很重要!很重要!!!一定要理解和认真思考。 01 - Java并发编程与高并发解决方案笔记-基础篇 1.课程准备 2.并发编程基础 2-0 CPU多级缓存 2-1 CPU多级缓存 - 缓存一致性(MESI) 2-2 CPU多级缓存-乱序执行优化 2-3 Java内存模型(Java Memory Model,JM...

Mr、温少的博客 1万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

并发编程基础篇和中级篇

添加链接描述

java技术学习 271

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Java 并发编程基础

Java 并发编程基础,涉及并发与并行的区别、进程与线程的区别、Java 线程基础、共享资源访问控制等内容。

leileiluoluo的博客 2177

深入浅出Java并发编程:线程基础

通过本文的学习,我们详细探讨了Java并发编程中的线程基础,包括进程与线程的区别、线程的创建方式线程的生命周期守护线程与用户线程、以及线程优先级与调度策略。掌握这些基础知识是进一步学习并发编程的关键。在实际开发中,理解并正确使用这些概念可以帮助我们构建高效、稳定的多线程应用。然而,并发编程的复杂性远不止于此,后续我们还将深入探讨线程安全、锁机制、线程通信等高级主题。

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 1935

并发编程学习【基础篇】

由浅入深地学习JUC,一起每天进步一点!

qq_44654974的博客 872

《Java并发编程的艺术》之 Java并发编程基础

《Java并发编程的艺术》之 Java并发编程基础 文章目录《Java并发编程的艺术》之 Java并发编程基础线程简介什么是线程代码清单4-1 MultiThread.java解析为什么要使用多线程更多的处理器核心更快的响应时间线程优先级代码清单4-2 Priority.java结果注意参数解析线程的状态注意Daemon线程注意注意启动和终止线程构造线程代码清单4-6 Thread.java启动线程注意理解中断代码清单4-7 Interrupted.java过期的suspend()、resume()和sto

weixin_44019182的博客 2496

JUC并发编程-高级篇

JUC并发编程-高级篇:1. JUC并发编程介绍、2. 线程基础知识

LiuYQi的博客 911
上一篇: Gitlab CI yaml官方配置文件翻译
下一篇: (2)Java并发编程基础篇
yi博说
博客等级 码龄11年 20粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值