出自

腾讯课堂 700多分钟干货实战Java多线程高并发高性能实战全集 , 我学习完了之后, 我给 老师在课上说的话做了个笔记,以及视频的内容,还有代码敲了一遍,然后添加了一些注释,把执行结果也整理了一下, 做了个笔记

实战背景

在企业年会或者商场举办的商业活动等场景中,经常会出现多人多轮次抽奖的场景,假设你是架构师,请运用多线程相关的知识开发多人多轮次抽奖的功能,每个轮次抽奖人数是6人,每次只有1人中奖,总共有20个场次抽奖,每个场次间隔时间是0.5秒,每次用户领奖时间是1秒.

思路

1.分析多人多轮次的随机抽奖的特点

人多,轮次多,并发随机的,所以和并发性是有关系的.

随机抽奖 就是每次人的抽奖顺序是随机的

2.奖品和人之间有什么关系?

很多人抽奖,只有一个人去中奖,所以每个人就是一个线程,然后人去竞争奖品,

3.并发安全性:多人多轮次随机抽奖,如何保证奖品的安全性

人有很多,但是奖品只有一个,我们要给奖品加锁,

4.每一个参与抽奖的人,怎么知道自己的抽奖结果?

其实就是返回的结果,我们可以用Callable,当然还有其它的方式.

5.如何随机设置每一个参赛者的优先级?

这个就要用到线程的优先级了,每个人就是每个线程,然后就是让每个线程设置随机优先级,这样就是随机抽奖了,如果你不设置优先级的话,那么就会出现哪个线程先执行,哪个线程就抽到奖了,那么别的线程就轮不到了.

代码地址

https://gitee.com/zjj19941/mutil-thread/tree/master/src/main/java/com/yrxy/thread/case7

代码

奖品线程

import java.util.concurrent.Callable;/*** 奖品线程*/
public class PrizeThread implements Callable<String> {Object prize = new Object();boolean flag = false;@Overridepublic String call() throws Exception {Thread.sleep(1000);synchronized (prize) {if (flag == false) {// 第一个进来的人立马给标记位改成true了,然后别人再进来之后,发现是true就直接 就得到结果是 抽奖失败flag = true;return Thread.currentThread().getName() + "抽奖成功!";} else {return Thread.currentThread().getName() + "抽奖失败!";}}}}

test类

import java.util.concurrent.FutureTask;public class Test {public static void main(String[] args) throws Exception {int max = 10, min = 1;Thread tha;Thread thb;Thread thc;Thread thd;Thread the;Thread thf;for (int i = 1; i < 21; i++) { // 20场抽奖PrizeThread thread = new PrizeThread();FutureTask<String> ftA = new FutureTask<String>(thread);FutureTask<String> ftB = new FutureTask<String>(thread);FutureTask<String> ftC = new FutureTask<String>(thread);FutureTask<String> ftD = new FutureTask<String>(thread);FutureTask<String> ftE = new FutureTask<String>(thread);FutureTask<String> ftF = new FutureTask<String>(thread);tha = new Thread(ftA, "用户A");//因为是随机抽奖, 随机设置线程的优先级tha.setPriority((int) (Math.random() * (max - min) + min));tha.start();thb = new Thread(ftB, "用户B");thb.setPriority((int) (Math.random() * (max - min) + min));thb.start();thc = new Thread(ftC, "用户C");thc.setPriority((int) (Math.random() * (max - min) + min));thc.start();thd = new Thread(ftD, "用户D");thd.setPriority((int) (Math.random() * (max - min) + min));thd.start();the = new Thread(ftE, "用户E");the.setPriority((int) (Math.random() * (max - min) + min));the.start();thf = new Thread(ftF, "用户F");thf.setPriority((int) (Math.random() * (max - min) + min));thf.start();System.out.println("=====第" + i + "轮抽奖开始====");System.out.println(ftA.get()); //获取随机抽奖的结果System.out.println(ftB.get());System.out.println(ftC.get());System.out.println(ftD.get());System.out.println(ftE.get());System.out.println(ftF.get());System.out.println("=====第" + i + "轮抽奖结束====");Thread.sleep(500);}}}

调用测试类输出结果

=====第1轮抽奖开始====
用户A抽奖失败!
用户B抽奖失败!
用户C抽奖失败!
用户D抽奖失败!
用户E抽奖成功!
用户F抽奖失败!
=====第1轮抽奖结束====
=====第2轮抽奖开始====
用户A抽奖失败!
用户B抽奖失败!
用户C抽奖成功!
用户D抽奖失败!
用户E抽奖失败!
用户F抽奖失败!
=====第2轮抽奖结束====
=====第3轮抽奖开始====
用户A抽奖失败!
用户B抽奖失败!
用户C抽奖失败!
用户D抽奖失败!
用户E抽奖失败!
用户F抽奖成功!
=====第3轮抽奖结束====
=====第4轮抽奖开始====
用户A抽奖失败!
用户B抽奖失败!
用户C抽奖失败!
用户D抽奖失败!
用户E抽奖成功!
用户F抽奖失败!
=====第4轮抽奖结束====
=====第5轮抽奖开始====
用户A抽奖失败!
用户B抽奖失败!
用户C抽奖失败!
用户D抽奖失败!
用户E抽奖成功!
用户F抽奖失败!
=====第5轮抽奖结束====
=====第6轮抽奖开始====
用户A抽奖失败!
用户B抽奖失败!
用户C抽奖成功!
用户D抽奖失败!
用户E抽奖失败!
用户F抽奖失败!
=====第6轮抽奖结束====
=====第7轮抽奖开始====
用户A抽奖失败!
用户B抽奖失败!
用户C抽奖失败!
用户D抽奖失败!
用户E抽奖成功!
用户F抽奖失败!
=====第7轮抽奖结束====
=====第8轮抽奖开始====
用户A抽奖失败!
用户B抽奖失败!
用户C抽奖成功!
用户D抽奖失败!
用户E抽奖失败!
用户F抽奖失败!
=====第8轮抽奖结束====
=====第9轮抽奖开始====
用户A抽奖成功!
用户B抽奖失败!
用户C抽奖失败!
用户D抽奖失败!
用户E抽奖失败!
用户F抽奖失败!
=====第9轮抽奖结束====
=====第10轮抽奖开始====
用户A抽奖失败!
用户B抽奖失败!
用户C抽奖失败!
用户D抽奖失败!
用户E抽奖成功!
用户F抽奖失败!
=====第10轮抽奖结束====
=====第11轮抽奖开始====
用户A抽奖成功!
用户B抽奖失败!
用户C抽奖失败!
用户D抽奖失败!
用户E抽奖失败!
用户F抽奖失败!
=====第11轮抽奖结束====
=====第12轮抽奖开始====
用户A抽奖失败!
用户B抽奖成功!
用户C抽奖失败!
用户D抽奖失败!
用户E抽奖失败!
用户F抽奖失败!
=====第12轮抽奖结束====
=====第13轮抽奖开始====
用户A抽奖失败!
用户B抽奖成功!
用户C抽奖失败!
用户D抽奖失败!
用户E抽奖失败!
用户F抽奖失败!
=====第13轮抽奖结束====
=====第14轮抽奖开始====
用户A抽奖失败!
用户B抽奖失败!
用户C抽奖成功!
用户D抽奖失败!
用户E抽奖失败!
用户F抽奖失败!
=====第14轮抽奖结束====
=====第15轮抽奖开始====
用户A抽奖失败!
用户B抽奖成功!
用户C抽奖失败!
用户D抽奖失败!
用户E抽奖失败!
用户F抽奖失败!
=====第15轮抽奖结束====
=====第16轮抽奖开始====
用户A抽奖失败!
用户B抽奖失败!
用户C抽奖失败!
用户D抽奖失败!
用户E抽奖失败!
用户F抽奖成功!
=====第16轮抽奖结束====
=====第17轮抽奖开始====
用户A抽奖失败!
用户B抽奖失败!
用户C抽奖失败!
用户D抽奖失败!
用户E抽奖成功!
用户F抽奖失败!
=====第17轮抽奖结束====
=====第18轮抽奖开始====
用户A抽奖成功!
用户B抽奖失败!
用户C抽奖失败!
用户D抽奖失败!
用户E抽奖失败!
用户F抽奖失败!
=====第18轮抽奖结束====
=====第19轮抽奖开始====
用户A抽奖失败!
用户B抽奖失败!
用户C抽奖失败!
用户D抽奖失败!
用户E抽奖失败!
用户F抽奖成功!
=====第19轮抽奖结束====
=====第20轮抽奖开始====
用户A抽奖失败!
用户B抽奖失败!
用户C抽奖失败!
用户D抽奖成功!
用户E抽奖失败!
用户F抽奖失败!
=====第20轮抽奖结束====

Java多人抽奖案例相关推荐

  1. 如何设计百万人抽奖系统——面试10多家中大厂后的万字总结

    思维导图 ​ 导图按照由浅入深的方式进行讲解,架构从来不是设计出来的,而是演进而来的 从一个几百人的抽奖系统到几万人,再到到百万人,不断增加新的东西. 最后总结归纳一套设计思想,也是万能模板,这样面试 ...

  2. Netty框架多人聊天案例,代码示例

    Netty框架多人聊天案例,代码示例 pom <?xml version="1.0" encoding="UTF-8"?> <project ...

  3. java day51【综合案例day03】

    由java day50[综合案例day02] 12.旅游线路名称查询 12.1    查询参数的传递 在header.html中 $("#search-button").click ...

  4. 对于自学Java的人来说,如何系统的,全方面的学习Java?

    我今年41岁,使用Java开发将近20年了,目前还在技术一线. 虽然我是科班出身,但其实十多年走过来,无论是Java语言本身,还是相伴的工具和框架都发生了巨大变化.而我自己也是一路学习新技能,一路丢弃 ...

  5. java写一个外网访问的接口_【JAVA基础】一个案例搞懂类、对象、重载、封装、继承、多态、覆盖、抽象和接口概念及区别(中篇)...

    0 前言 初学JAVA时,总会对一些概念一知半解,相互混淆,不明其设计的用意,如类.对象.重载.封装.继承.多态.覆盖.抽象类.接口概念.为便于理解和巩固,本文将基于一个案例及其变形,展现各个概念的定 ...

  6. Java继承多态经典案例分享

    今天动力节点java培训机构小编为大家分享Java继承多态经典案例,希望通过此文能够帮助到大家,下面就随小编一起看看Java继承多态经典案例. public class A { public Stri ...

  7. Mblog 开源Java多人博客系统

    Mblog 开源Java多人博客系统 技术选型: JDK8 MySQL Spring-boot Spring-data-jpa Shiro Hibernate-search Ehcache Freem ...

  8. 猜物品游戏java编程_小猿圈Java初学者练习小案例:猜数字游戏

    对于Java初学者,如果没有好的引导,可能会觉得自己学什么都不好,学什么都不会,这个时候就要给他们一下小的案例,让他们去实践一下,让他们知道自己学的东西是可以用到的,小猿圈java讲师为你准备了Jav ...

  9. Java Web应用小案例:查询城市天气信息

    Java Web应用小案例:查询城市天气信息 本期上大数据1班动态网站设计与开发课,经过半期的学习,学生已经可以利用所学的JSP知识开发简单的基于后台数据库操作的动态网站,但是这是远远不够的,课程教学 ...

  10. Java Web应用小案例:猜数小游戏

    Java Web应用小案例:猜数小游戏 文章目录 一.演示Python版猜数游戏 二.JSP版猜数游戏程序运行效果

最新文章

  1. 表达式树 java_表达树—构建表达式树、获取表达式(二)
  2. Java计算两个时间差
  3. C# 循环语句 for循环
  4. 一个App完成入门篇(一)-从Hello world开始
  5. java 日志输出 上下文_java – 使用ServletContextListener和SLF4J在contextDestroyed上没有日志输出...
  6. CIO客观评价SAP和用友的差异
  7. Linux C : GDB调试命令汇总
  8. 线程阻塞和挂起(网络收集)
  9. roads 构筑极致用户体验_长安马自达「悦马星空」计划上线,为用户带来极致服务体验...
  10. 常用的java包_java的常用包
  11. socket pro
  12. 渗透测试工程师基础入门
  13. 清华大学、北京大学毕业生的去向
  14. 大连创业圈:孤独与寂寞并存
  15. 侯捷C++系统工程师
  16. 双因素认证令牌_(完整版)双因素认证解决方案
  17. 用Requests下载百度一页图片,以下载芳心纵火犯为例
  18. BaiduMapTileCutter切百度地图瓦片
  19. 零基础怎么学Python?要学多久?
  20. 详解 OpenCV 透视变换原理 及 实例

热门文章

  1. 麦克风和扬声器选型介绍
  2. ChinaITLab-Linux工程师培训课程笔记5
  3. Linux驱动开发|USB驱动
  4. 突破速达系列软件科目级长的限制
  5. Keysight WIFI6测试培训笔记
  6. Java全栈工程实践
  7. 揭密征途赚钱模式:史玉柱在赚谁的钱
  8. qcom内存大小配置及调频测试
  9. TCN机器之心的转载,后面需要实现
  10. 闪存类型测试软件,一芯U盘闪存测试工具(DieSorting)