抢红包也用到了多线程
假设:100块,分成了3个包,现在有5个人去抢其中,红包是共享数据5个人是5条线程。
打印结果如下
XXX抢到了XXX元
XXX抢到了XXX元
XXX抢到了XXX元
XXX没抢到
XXX没抢到
分析 : 三个人抢到了三个红包,那么也就是要求三个人抢到的红包必须得保证都有钱而且红包里面的钱必须随机,如果前两个相加或者其中一个获得100元则都不行,所有可以先保证第二个第三个抢到红包的最少有1元,则第一个最多有98元,所以第一个红包取值范围为1~98之间
int first = r.nextInt(98)+1;
第二个人就是在1~(99-first)之间取
int second = r.nextInt(99-first)+1;
最终结果为
package com.heima.d_text;
import java.util.Arrays;
import java.util.Random;
class Money implements Runnable{
private int[]arr;
private static int count =3;
public Money(int[] arr) {
this.arr = arr;
}
@Override
public void run() {
if (count==0){
System.out.println(Thread.currentThread().getName()+"没抢到");
}
while (count > 0){
synchronized (this){
if (count > 0){
System.out.println(Thread.currentThread().getName()+"抢到了"+arr[count-1]+"元");
count--;
}
}
try {
Thread.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Demo4 {
public static void main(String[] args) {
Random r = new Random();
int first = r.nextInt(98)+1;
int second = r.nextInt(99 - first)+1;
int third = 100 - first - second;
int[]arr = {first,second,third};
System.out.println(Arrays.toString(arr));
Money money = new Money(arr);
new Thread(money,"第一个人").start();
new Thread(money,"第二个人").start();
new Thread(money,"第三个人").start();
new Thread(money,"第四个人").start();
new Thread(money,"第五个人").start();
}
}
这里需要注意的是要求第四个和第五个只打印一遍,则需要将第四个和第五个人的放在while循环外面否则第四个第五个会被每个线程都访问一次