当前位置: 首页 > news >正文

【Java】Java 多线程的应用场景

文章目录

  • 前言
  • 多线程的常见应用场景
  • 多线程使用的主要目的在于
  • 业务需求
  • 程序设计
  • 代码示例
  • 运行结果
  • 总结

前言

Java多线程程序设计到的知识:

  1. 对同一个数量进行操作

  2. 对同一个对象进行操作

  3. 回调方法使用

  4. 线程同步,死锁问题

  5. 线程通信

多线程的常见应用场景

  1. 后台任务,例如:定时向大量(100w以上)的用户发送邮件;
  2. 异步处理,例如:发微博、记录日志等;
  3. 分布式计算

多线程使用的主要目的在于

  1. 吞吐量:你做WEB,容器帮你做了多线程,但是他只能帮你做请求层面的。简单的说,可能就是一个请求一个线程。或多个请求一个线程。如果是单线程,那同时只能处理一个用户的请求。

  2. 伸缩性:也就是说,你可以通过增加CPU核数来提升性能。如果是单线程,那程序执行到死也就利用了单核,肯定没办法通过增加CPU核数来提升性能。

在java中,每一个线程有一块工作内存区,其中存放着被所有线程共享的主内存中的变量的值的拷贝。当线程执行时,它在自己的工作内存中操作这些变量。

为了存取一个共享的变量,一个线程通常先获取锁定并且清除它的工作内存区,这保证该共享变量从所有线程的共享内存区正确地装入到线程的工作内存区,当线程解锁时保证该工作内存区中变量的值协会到共享内存中。

当一个线程使用某一个变量时,不论程序是否正确地使用线程同步操作,它获取的值一定是由它本身或者其他线程存储到变量中的值。例如,如果两个线程把不同的值或者对象引用存储到同一个共享变量中,那么该变量的值要么是这个线程的,要么是那个线程的,共享变量的值不会是由两个线程的引用值组合而成。

一个变量时Java程序可以存取的一个地址,它不仅包括基本类型变量、引用类型变量,而且还包括数组类型变量。保存在主内存区的变量可以被所有线程共享,但是一个线程存取另一个线程的参数或者局部变量时不可能的,所以开发人员不必担心局部变量的线程安全问题。

业务需求

电影院新片首映,观影人数大量增加,为提高日营业额,线下售票窗口由原单窗口调整为3窗口,设计一段简单的程序模拟该售票过程。

程序设计

多线程场景下需考虑线程安全的问题,避免多个线程争抢同一个资源导致业务逻辑出现错误。实现线程安全的方式有很多,这里使用Java Lock 接口中的方法实现。

代码示例

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;/*** 测试类*/
public class DemoTest {public static void main(String[] args) {//窗口01new Thread(() -> {while (true) {//售票并获取售票后的当前票余量int currentTickets = TicketSource.saleTickets();//模拟售票员卖出一张票用时1秒waitProcess();//票已卖完if (currentTickets <= 0) break;}}, "01").start();//窗口02new Thread(() -> {while (true) {int currentTickets = TicketSource.saleTickets();waitProcess();if (currentTickets <= 0) break;}}, "02").start();//窗口03new Thread(() -> {while (true) {int currentTickets = TicketSource.saleTickets();waitProcess();if (currentTickets <= 0) break;}}, "03").start();}private static void waitProcess() {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}/*** 电影票资源类*/
class TicketSource {//当前电影票余量private static int currentTickets = 30;//加锁确保多线程场景下的线程安全private static final Lock lock = new ReentrantLock();/*** 卖票** @return 当前电影票余量*/public static int saleTickets() {lock.lock();try {if (currentTickets > 0) {//模拟卖票currentTickets--;if (currentTickets == 0) {//票余量为 0 停止售卖System.out.println(Thread.currentThread().getName() + "窗口出票成功!"+ "当前票余量:" + currentTickets+ " 今日票已卖完!");} else {System.out.println(Thread.currentThread().getName() + "窗口出票成功!"+ "当前票余量:" + currentTickets);}} else {//票余量为 0 停止售卖System.out.println(Thread.currentThread().getName() + "窗口:今日票已卖完!");}} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}return currentTickets;}}

运行结果

D:\installPath\Java\jdk1.8.0_121\bin\java.exe "-javaagent:D:\installPath\IntelliJ IDEA 2019.1.4\lib\idea_rt.jar=64339:D:\installPath\IntelliJ IDEA 2019.1.4\bin"
01窗口出票成功!当前票余量:29
02窗口出票成功!当前票余量:28
03窗口出票成功!当前票余量:27
01窗口出票成功!当前票余量:26
03窗口出票成功!当前票余量:25
02窗口出票成功!当前票余量:24
03窗口出票成功!当前票余量:23
01窗口出票成功!当前票余量:22
02窗口出票成功!当前票余量:21
02窗口出票成功!当前票余量:20
03窗口出票成功!当前票余量:19
01窗口出票成功!当前票余量:18
01窗口出票成功!当前票余量:17
02窗口出票成功!当前票余量:16
03窗口出票成功!当前票余量:15
02窗口出票成功!当前票余量:14
01窗口出票成功!当前票余量:13
03窗口出票成功!当前票余量:12
01窗口出票成功!当前票余量:11
03窗口出票成功!当前票余量:10
02窗口出票成功!当前票余量:9
03窗口出票成功!当前票余量:8
02窗口出票成功!当前票余量:7
01窗口出票成功!当前票余量:6
03窗口出票成功!当前票余量:5
02窗口出票成功!当前票余量:4
01窗口出票成功!当前票余量:3
01窗口出票成功!当前票余量:2
03窗口出票成功!当前票余量:1
02窗口出票成功!当前票余量:0 今日票已卖完!
01窗口:今日票已卖完!
03窗口:今日票已卖完!Process finished with exit code 0

总结

代码块锁是一个防止数据发生错误的一个重要手段。

对象的统一性是非常重要的,这要想到对象的传入问题,

要操作的对象只能new一次,其他的操作都是对这个传入的对象进行的,

才能保证数据一致性,完整性和正确性。

相关文章:

【Java】Java 多线程的应用场景

文章目录 前言多线程的常见应用场景多线程使用的主要目的在于业务需求程序设计代码示例运行结果总结 前言 Java多线程程序设计到的知识&#xff1a; 对同一个数量进行操作 对同一个对象进行操作 回调方法使用 线程同步&#xff0c;死锁问题 线程通信 … 多线程的常见应用…...

Mysql--技术文档--索引-《索引为什么查找数据快?》-超底层详细说明索引

索引的概念 在MySQL中&#xff0c;索引是一种数据结构&#xff0c;它被用于快速查找、读取或插入数据。索引能够极大地提高数据库查询的速度。 索引的工作方式类似于图书的索引。如果你想在图书馆找到一本书&#xff0c;你可以按照书名进行查找。书名就像是一个索引&#xf…...

jmeter 接口快速创建

通过cURL命令创建测试计划 从浏览器获取接口 从postman获取接口...

docker 笔记10:Docker轻量级可视化工具Portainer

1. 是什么 Portainer 是一款轻量级的应用&#xff0c;它提供了图形化界面&#xff0c;用于方便地管理Docker环境&#xff0c;包括单机环境和集群环境。 2.安装 https://docs.portainer.io/v/ce-2.9/start/install/server/docker/linux 步骤 docker命令安装 docker run -d …...

028:vue上传解析excel文件,列表中输出内容

第028个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…...

在VR全景中嵌入3D模型有哪些优势?

现阶段&#xff0c;很多商企都会引入VR全景展示来宣传推广自己的产品、服务以及环境&#xff0c;但是环境展示凸显的沉浸式体验只是 VR全景一部分的价值所在&#xff0c;商企使用VR全景还有一个优势就是互动性&#xff0c;通过丰富多样的互动性&#xff0c;让用户同VR场景中的物…...

c高级day2 linux指令的补充和shell脚本

思维导图 写一个1.sh脚本&#xff0c;将以下内容放到脚本中&#xff1a; 在家目录下创建目录文件&#xff0c;dir 在dir下创建dir1和dir2 把当前目录下的所有文件拷贝到dir1中&#xff0c; 把当前目录下的所有脚本文件拷贝到dir2中 把dir2打包并压缩为dir2.tar.xz 再把di…...

Rabbitmq 常见问题处理

Rabbitmq queue NaN status code 如下图&#xff1a; 参考文章 ## https://groups.google.com/g/rabbitmq-users/c/4MlYbOXvy4E## https://groups.google.com/g/rabbitmq-users/c/SsXtN165_30### https://www.cnblogs.com/weschen/p/13321817.html### https://community.piv…...

人工智能和大数据:跨境电商如何实现定制化营销?

在跨境电商竞争激烈的市场中&#xff0c;如何精准地满足消费者的需求并提供个性化的购物体验成为了商家们面临的重要挑战。幸运的是&#xff0c;人工智能和大数据技术的崛起为跨境电商带来了新的机遇&#xff0c;使得定制化营销成为可能。本文将探讨人工智能和大数据在跨境电商…...

博物馆网上展厅有哪些用途,如何搭建数字时代的文化宝库

引言&#xff1a; 博物馆一直以来都是保存、展示和传承人类文化遗产的地方。然而&#xff0c;随着数字时代的来临&#xff0c;博物馆也逐渐迎来了创新的变革。博物馆网上展厅&#xff0c;作为一种新型的文化传播方式&#xff0c;正逐渐崭露头角。 一.什么是博物馆网上展厅&…...

shiro反序列化漏洞

文章目录 一、反序列化概念1.什么是序列化&#xff1f;2.序列化出现场景 二、Apache Shiro 1.2.4反序列化漏洞1.定义2.Shiro反序列化漏洞原理3.漏洞特征 三、CVE-2016-4437漏洞复现(实验)1.搭建环境2.漏洞特征验证1)未登陆验证2)登陆失败验证3)登陆成功验证① 不勾选② 勾选 …...

无需公网IP,实现外网远程访问管家婆ERP进销存系统的方法

文章目录 前言 1.管家婆服务2. 内网穿透2.1 安装cpolar内网穿透2.2 设置远程访问 3. 固定访问地址4. 配置固定公网访问地址 前言 管家婆辉煌系列产品是中小企业进销存、财务管理一体化的典范软件&#xff0c;历经十余年市场的洗礼&#xff0c;深受广大中小企业的欢迎&#xff…...

C#,《小白学程序》第十三课:阶乘(Factorial)的计算方法与代码

1 文本格式 /// <summary> /// 阶乘的非递归算法 /// </summary> /// <param name"a"></param> /// <returns></returns> private int Factorial_Original(int a) { int r 1; for (int i a; i > 1; i--) { …...

以antd为例 React+Typescript 引入第三方UI库

本文 我们来说说 第三方UI库 其实应用市场上的 第三方UI库都是非常优秀的 那么 react 我们比较熟的肯定还是 antd 我们还是来用它作为演示 这边 我们先访问他的官网 https://3x.ant.design/index-cn 点击开始使用 在左侧 有一个 在 TypeScript 中使用 通过图标我们也可以看出…...

matlab如何遍历文件夹及子文件夹下的所有文件

需求 有一个比较深层的文件夹&#xff0c;每个文件夹及其子文件夹下都可能存在我所需要的csv文件&#xff0c;写一个函数&#xff0c;输入文件夹路径后可以返回所有符合要求的csv文件。 代码实现 % folder_path为输入的文件夹&#xff0c;str为指定的文件所特有的关键字&…...

Win11怎么显示隐藏文件

为了保护电脑的安全&#xff0c;系统会将一些重要的文件或者文件夹隐藏起来&#xff0c;导致我们无法轻易的找到和打开&#xff0c;那么这些隐藏的文件怎么显示呢&#xff0c;下面小编就给大家带来Win11显示隐藏文件的方法&#xff0c;感兴趣的小伙伴快来和小编一起看看吧。 W…...

Golang专题精进

Golang专题精进 Golang单元测试Golang错误处理Golang正则表达式Golang反射Golang验证码Golang日期时间处理库CarbonGolang发送邮件库emailGolang log日志Golang log日志框架logrusGolang加密和解密应用Golang访问权限控制框架casbinGolang使用swagger生成api接口文档Golang jwt…...

手游联运平台都具备哪些功能?

手游联运平台是为了方便游戏发行商进行游戏发行和运营而提供的一种服务平台&#xff0c;具备多种功能以支持游戏在不同渠道上的推广和运营。以下是一些手游联运平台通常具备的功能&#xff1a; 多渠道发行&#xff1a;提供多种渠道&#xff0c;如应用商店、社交媒体、合作伙伴等…...

98. 验证二叉搜索树

给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例 1&#xff1a; 输入&am…...

Stream API

Stream API执行流程 Stream API(java.util.stream)把真正的函数式编程风格引入到Java中,可以极大地提高程序员生产力&#xff0c;让程序员写出高效、简洁的代码 实际开发中项目中多数数据源都是来自MySQL、Oracle等关系型数据库,还有部分来自MongDB、Redis等非关系型数据库 …...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...