java多线程与JUC

article/2025/8/7 16:01:01

进程线程

进程:进程是操作系统分配资源的基本单位。在电脑中,一个软件就是一个进程

线程:线程是CPU调度的基本单位,是进程内的执行单元。相当于一个软件中的不同功能

多线程程序的特点:程序可以同时去做多件事,CPU可以在多件事之间切换,把等待的空余时间充分利用起来,提高程序的运行效率

多线程的应用场景?

只要你想让多个事情同时运行就需要用到多线程。

比如:软件中的耗时、等待操作、所有的聊天软件、所有的服务器。

并发并行

并发:在一个CPU交替执行

并行:在多个CPU同时执行

电脑CPU线程数就表示同一时间可以同时运行的线程数量

4线程,表示可以同时并行4个线程,当时要运行的线程数量过多时,就会并发和并行同时发生

多线程实现方式

1,继承Thread类

  • 先自己定义一个类进程Thread类
  • 重写run方法,编写线程要执行的代码
  • 创建子类对象,调用start方法,启动线程

2,实现Runnable接口

  • 创建一个自己类实现Runnable接口
  • 重写run方法,编写线程要执行的代码
  • 创建自己类的对象
  • 创建一个Thread类的对象并传递自己类的对象,并开启线程

3,实现Callable接口或者Future接口(有返回值)

对前面两种的优化,可以获取到多线程运行的结果。

  • 创建一个类MyCallable(自己随便创建的类)实现callable接口
  • 重写call方法(是有返回值的,表示多线程运行的结果)
  • 以下在测试类中写
  • 创建MyCallable的对象(表示多线程要执行的任务)
  • 创建FutureTask的对象(将MyCallable对象传入。作用管理多线程运行的结果,Future是一个接口)
  • 创建Thread类的对象,并启动(将FutureTask对象传入。表示线程)

三种实现方式对比


 

Thread中常见的成员方法

细节:

  1. 如果我们没有给线程设置名字,线程也是有默认的名字(格式:Thread-X,X是序号,从0开始)。创建Thread对象时,也可以利用构造方法设置名字
  2. 当JVM虚拟机启动之后,会自动的启动多条线程。其中有一条线程就叫做main线程,他的作用就是去调用main方法,并执行里面的代码。
  3. 哪条线程执行到sleep方法,那么哪条线程就会在这里停留对应的时间。方法的参数:就表示睡眠的时间,单位是毫秒。1 秒=1000毫秒。当时间到了之后,线程会自动的醒来,继续执行下面的其他代码

线程优先级相关方法

线程调度:抢占式调度(随机性,相互抢),非抢占式调度(所有线程轮流执行)

java中是采用了抢占式调度,所以有设置线程优先级的方法。

设置线程的优先级越大,抢到CPU的概率越大,执行的机会就越大。一共分10档(1-10,没有设置默认为5)

守护线程方法

将某个线程设置为守护线程(备胎线程),其他非守护线程(女神线程)执行结束,守护线程陆续结束,而不是立刻结束,守护线程会执行一小会。

出让线程/插入线程(了解即可)

前面线程执行都是随机的,为了让线程执行尽可能雨露均沾就提出了出让/礼让线程

哪个线程执行了yield方法,就表示出让了当前CPU执行权,让另一个线程执行

哪个线程执行了join方法,就表示把该线程插入到当前线程之前,执行完后再执行别的


 

线程生命周期

注意:一个线程sleep完后,不会立马执行,需要去抢CPU执行权,抢到了才能执行

 


 

线程安全问题 

在卖票时,在还没打印出来时,就被别的线程抢走,票的数量加1,再打印出现超卖和没有第1张票

利用同步代码块

操作共享数据的代码锁起来。

特点1:锁默认打开,有一个线程进去了,锁自动关闭

特点2:里面代码全部执行完,线程出来,锁自动打开

锁:锁对象,只要保持唯一就行,加static关键字。

这种方式叫同步代码块

同步代码块的细节:

  1.  synchronized不能写在循坏外面
  2. synchronized(锁对象),其中锁对象一定要是唯一的,不唯一,那就说明不同线程看的锁是不一样的,那锁相当于没有
public class MyThread extends Thread {//表示这个类所有的对象,都共享ticket数据static int ticket = 0;//0 ~ 99@Overridepublic void run() {while (true) {synchronized (MyThread.class) {//同步代码块if (ticket < 100) {try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}ticket++;System.out.println(getName() + "正在卖第" + ticket + "张票!!!");} else {break;}}}}}
public class ThreadDemo {public static void main(String[] args) {/*需求:某电影院目前正在上映国产大片,共有100张票,而它有3个窗口卖票,请设计一个程序模拟该电影院卖票*///创建线程对象MyThread t1 = new MyThread();MyThread t2 = new MyThread();MyThread t3 = new MyThread();//起名字t1.setName("窗口1");t2.setName("窗口2");t3.setName("窗口3");//开启线程t1.start();t2.start();t3.start();}
}

利用同步方法

直接把synchronized关键字加到方法上

不知道将哪些操作写到同步方法里。那就先写同步代码块,再将同步代码块抽取成一个方法即可。

public class MyRunnable implements Runnable {//不用写static,因为MyRunnable对象是作为一个参数,让线程去执行的,所以MyRunnable只会创建一个MyRunnable对象int ticket = 0;@Overridepublic void run() {//1.循环while (true) {//2.同步代码块(同步方法)if (method()) break;}}//thisprivate synchronized boolean method() {//3.判断共享数据是否到了末尾,如果到了末尾if (ticket == 100) {return true;} else {//4.判断共享数据是否到了末尾,如果没有到末尾try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}ticket++;System.out.println(Thread.currentThread().getName() + "在卖第" + ticket + "张票!!!");}return false;}
}
public class ThreadDemo {public static void main(String[] args) {/*需求:某电影院目前正在上映国产大片,共有100张票,而它有3个窗口卖票,请设计一个程序模拟该电影院卖票利用同步方法完成技巧:同步代码块*/MyRunnable mr = new MyRunnable();Thread t1 = new Thread(mr);Thread t2 = new Thread(mr);Thread t3 = new Thread(mr);t1.setName("窗口1");t2.setName("窗口2");t3.setName("窗口3");t1.start();t2.start();t3.start();}
}


http://www.hkcw.cn/article/urBQCiMTDs.shtml

相关文章

GCC 下载安装

下载 官网&#xff1a;GCC, the GNU Compiler Collection- GNU Project Cygwin linux 环境 MinGW 在 Windows 上提供 GNU 开发工具比 Cygwin 更轻量&#xff08;不模拟完整的 POSIX 环境&#xff09;选择&#xff1a;binaries选择mingw-w64

GpuGeek如何成为AI基础设施市场的中坚力量

AI时代&#xff0c;算力基础设施已成为支撑技术创新和产业升级的关键要素。作为国内专注服务算法工程师群体的智算平台&#xff0c;GpuGeek通过持续创新的服务模式、精准的市场定位和系统化的生态建设&#xff0c;正快速成长为AI基础设施领域的中坚力量。本文将深入分析GpuGeek…

DAY 35 超大力王爱学Python

知识点回顾&#xff1a; 三种不同的模型可视化方法&#xff1a;推荐torchinfo打印summary权重分布可视化进度条功能&#xff1a;手动和自动写法&#xff0c;让打印结果更加美观推理的写法&#xff1a;评估模式 作业&#xff1a;调整模型定义时的超参数&#xff0c;对比下效果。…

MYOJ_4149:(洛谷P1002)[NOIP 2002 普及组] 过河卒(坐标型DP)

题目描述 棋盘上 A 点有一个过河卒&#xff0c;需要走到目标 B 点。卒行走的规则&#xff1a;可以向下、或者向右。同时在棋盘上 C 点有一个对方的马&#xff0c;该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。 棋盘用坐标表示&#xff0…

Java高效处理大文件:避免OOM的深度实践

​关键痛点​&#xff1a;当加载10GB的CSV文件时&#xff0c;Files.readAllLines()抛出OutOfMemoryError&#xff0c;该如何解决&#xff1f; 在Java中处理大文件是开发中的高频场景&#xff0c;尤其在大数据、日志分析等领域。本文将深入探讨几种高效处理大文件的方案&#x…

Word双栏英文论文排版攻略

word写双栏英文论文的注意事项 排版首先改字体添加连字符还没完呢有时候设置了两端对齐会出现这样的情况&#xff1a; 公式文献 等我下学期有时间了&#xff0c;一定要学习Latex啊&#xff0c;word写英文论文&#xff0c;不论是排版还是公式都很麻烦的&#xff0c;而Latex一键就…

esp-idf ubuntu环境配置

常用命令 source ~/esp/esp-idf/export.shidf.py --list-targets idf.py set-target 将清除 build 目录&#xff0c;并重新生成 sdkconfig 文件&#xff0c;原来的 sdkconfig 文件保存为 sdkconfig.old。 idf.py build idf.py flashNo module named pip wget https://bootst…

BFS入门刷题

目录 P1746 离开中山路 P1443 马的遍历 P1747 好奇怪的游戏 P2385 [USACO07FEB] Bronze Lilypad Pond B P1746 离开中山路 #include <iostream> #include <queue> #include <cstring> using namespace std; int n; int startx, starty; int endx, endy; …

Cypress + TypeScript + Vue3

🚀 从零构建 Cypress + TypeScript + Vue3 组件测试环境【详细实战教程】 组件测试是前端开发中不可忽视的一环,它能够帮助我们在开发阶段就发现 UI 与交互逻辑问题。本文将带你手把手搭建基于 Cypress + TypeScript + Vue3 的组件测试环境,包含完整目录结构、配置文件、组…

车辆检测算法在爆炸事故应急响应中的优化路径

视觉分析赋能车辆管控&#xff1a;以山东应急场景为例 背景&#xff1a;应急场景下的车辆管控痛点 近期山东多起爆炸事故暴露了应急响应中的车辆管理短板&#xff1a;消防车、救护车因违停车辆堵塞通道&#xff0c;违规车辆闯入事故核心区&#xff0c;传统监控系统依赖人工识别…

【小沐杂货铺】基于Three.JS绘制太阳系Solar System(GIS 、WebGL、vue、react,提供全部源代码)第2期

&#x1f37a;三维数字地球系列相关文章如下&#x1f37a;&#xff1a;1【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第一期2【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第二期3【小沐学GIS】…

π0论文阅读

https://www.physicalintelligence.company/download/pi0.pdf 模型输出的token&#xff0c;接diffusion模型&#xff0c;相比自OpenVLA那样的回归模型解码出action&#xff0c;输出更快&#xff0c;精度也会更高。 一、动作专家模块与流匹配&#xff08;Flow Matching&#xf…

安全漏洞修复导致SpringBoot2.7与Springfox不兼容

项目基于 springboot2.5.2 实现的&#xff0c;用 springfox-swagger2 生成与前端对接的 API 文档&#xff1b;pom.xml 中依赖如下 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId>&l…

VisionPro —— 不规则胶路检测

简介 本文介绍了一种基于Cognex视觉工具的胶路检测方法&#xff0c;分为直线和弧形两部分检测。 直线部分采用卡尺工具检测胶路宽度&#xff0c;通过动态调整仿射矩形区域进行多位置测量&#xff1b;弧形部分使用blob工具沿圆周设置检测区域。 两种方法均通过脚本实现工具映…

QT中更新或添加组件时出现“”qt操作至少需要一个处于启用状态的有效资料档案库“解决方法”

在MaintenanceTool.exe中点击下一步 第一个&#xff1a; 第二个&#xff1a; 第三个&#xff1a; 以上任意一个放入资料库中

【PyQt5】从零开始的PyQt5 - QLabel篇

从零开始的PyQt5 - QLabel篇 引言一、简述二、例程2.1 显示到QWidget窗口上2.2 重新设置Label大小和对齐方式2.3 添加内容&#xff0c;设置边框2.4 显示富文本 三、参考 引言 QLabel主要用于显示文本或图像&#xff0c;不提供用户交互功能。本文主要简述PyQt5中的QLabel以及展…

Microsoft Rewards——微软免费发钱!

Microsoft Rewards 是微软推出的用于推广其搜索引擎 Bing 的一项服务&#xff0c;用户只需要使用 Bing 进行任何搜索&#xff0c;就可以获得对应积分&#xff0c;可以兑换礼品卡等奖励。 ps&#xff1a;Bing本来就是中国大陆最好的搜索引擎。 举例&#xff1a;假设将 Bing 最为…

基于python的天气可视化系统的设计与实现

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;没有什么华丽的语言&#xff0…

设计模式——组合设计模式(结构型)

摘要 组合设计模式是一种结构型设计模式&#xff0c;用于将对象组合成树形结构以表示“部分-整体”的层次结构&#xff0c;使客户端对单个对象和组合对象具有一致的访问方式。它包含抽象组件、叶子节点和组合节点&#xff0c;具有统一处理、支持递归结构和易扩展等优点&#x…

Launcher3体系化之路

&#x1f44b; 欢迎来到Launcher 3 背景 车企对于桌面的排版布局好像没有手机那般复杂&#xff0c;但也有一定的需求。部分场景下&#xff0c;要考虑的上下文比手机要多一些&#xff0c;比如有如下的一些场景&#xff1a; 手车互联。HiCar&#xff0c;CarPlay&#xff0c;An…