出自 腾讯课堂 700多分钟干货实战Java多线程高并发高性能实战全集 , 我学习完了之后, 我给 老师在课上说的话做了个笔记,以及视频的内容,还有代码敲了一遍,然后添加了一些注释,把执行
出自
腾讯课堂 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;
public 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轮抽奖结束====