业务需求
电影院新片首映,观影人数大量增加,为提高日营业额,线下售票窗口由原单窗口调整为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

Java 多线程的应用场景相关推荐

  1. Java多线程的应用场景和应用目的举例

    微信公众号:javafirst 01 通俗的解释一下多线程 多线程用于堆积处理,就像一个大土堆,一个推土机很慢,那么10个推土机一起来处理,当然速度就快了,不过由于位置的限制,如果20个推土机,那么推 ...

  2. java多线程使用业务场景_Java多线程使用场景

    一.几个基本概念的区分 1.进程与程序的区分 程序 进程 包含代码部分.数据部分 包含代码部分.数据部分.进程控制块 顺序执行 并发执行 独占资源 共享资源 同步的 异步的 静态的 动态的 (本质区别 ...

  3. java多线程应用场景

    java多线程应用场景 本教程操作环境:windows7系统.java10版,DELL G3电脑. 1.应用场景 (1)普通浏览器和网络服务(现在写的网络是帮你完成线程控制的中间部件),网络处理请求, ...

  4. Java多线程系列(四):4种常用Java线程锁的特点,性能比较、使用场景

    多线程的缘由 在出现了进程之后,操作系统的性能得到了大大的提升.虽然进程的出现解决了操作系统的并发问题,但是人们仍然不满足,人们逐渐对实时性有了要求. 使用多线程的理由之一是和进程相比,它是一种非常花 ...

  5. Java多线程系列(七):并发容器的原理,7大并发容器详解、及使用场景

    之前谈过高并发编程系列: 高并发编程系列:4种常用Java线程锁的特点,性能比较.使用场景 高并发编程系列:CountDownLatch.Semaphore等4大并发工具类详解 高并发编程系列:4大J ...

  6. java火箭应用_从火箭发场景来学习Java多线程并发闭锁对象

    原标题:从火箭发场景来学习Java多线程并发闭锁对象 从火箭发场景来学习Java多线程并发闭锁对象 倒计时器场景 在我们开发过程中,有时候会使用到倒计时计数器.最简单的是:int size = 5; ...

  7. java 闭锁_从火箭发场景来学习Java多线程并发闭锁对象

    从火箭发场景来学习Java多线程并发闭锁对象 倒计时器场景 在我们开发过程中,有时候会使用到倒计时计数器.最简单的是:int size = 5; 执行后,size-这种方式来实现.但是在多线程并发的情 ...

  8. 如何应对面试官:什么场景中会用到java多线程?

    如何应对面试官:什么场景中会用到java多线程? 作者:云栖社区 原文:https://yq.aliyun.com/ziliao/1765 (点击文末阅读原文即可前往) 问:能不能简单描述一下你在ja ...

  9. Java多线程编程实战:模拟大量数据同步

    背景 最近对于 Java 多线程做了一段时间的学习,笔者一直认为,学习东西就是要应用到实际的业务需求中的.否则要么无法深入理解,要么硬生生地套用技术只是达到炫技的效果. 不过笔者仍旧认为自己对于多线程 ...

最新文章

  1. countif和sum套用_if函数嵌套countif、sumif函数实例操作详解 你需要学习了
  2. python返回unicode_我们如何从python中的字形id获取unicode?
  3. 机器学习预测+akshare
  4. 每天干的啥?(2019.3)
  5. linux系统怎样写单片机程序,单片机知识是Linux驱动开发的基础之一以及如何学单片机...
  6. 【Python3网络爬虫开发实战】 2.3-爬虫的基本原理
  7. winform 填充圆形 锯齿_Qt项目中,三种图形渐变填充方式详细总结
  8. 使用脚本将域账号添加到客户机的本地管理员组
  9. 如何查看Linux发行版内核版本及系统版本?
  10. 非专业人士观点(3)不要假如
  11. Echarts:Vue3中使用Echarts
  12. 会议直播方案 腾讯会议
  13. Julia: fill, repeat, repmat
  14. Eprime Feedback state激活错误 其他报错
  15. [转]大量正版软件下载链接
  16. 基于Unique ID的单片机程序加密系统 单片机唯一ID程序加密
  17. 计算机网络怎么算默认网关,ip地址子网掩码计算器_默认网关怎么计算_ip 掩码 网关的关系(2)...
  18. 在c语言中下列类型属于构造地震,C语言课后习题解析及答案
  19. Go 每日一库之 roaring
  20. 酷派大神F1-救砖详细教程! 酷派8297w(大神F1联通版) 恢复官方兼救砖

热门文章

  1. git常用命令梳理及常见开发场景总结
  2. ORA-03113和ORA-00204问题处理
  3. 前端html网页,点击按钮或超链接 弹出 一个登陆的div窗口或者对话框
  4. 记录一次前途迷茫的选择
  5. 常见路由协议总览以及路由协议分类方式
  6. 毕业论文参考文献引用
  7. 梯度下降法和最速下降法区别
  8. Python 英文文本字母跳转概率统计
  9. 《OpenDRIVE1.6规格文档》3
  10. 点餐系统部署文档,java后台部署和微信点餐小程序的部署