JAVA多线程抢红包的实现示例

网友投稿 246 2022-10-30


JAVA多线程抢红包的实现示例

大体思路

红包的分发见java作业——红包分发。

而抢红包rwPwex要解决的是线程问题。

其实比较简单,设定好人数,每个人一个线程,每个线程执行一遍,有红包就抢,没有红包就抢不到,所以run函数中只要判断现在还有没有红包就可以了。

代码实现

import java.util.Random;

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

int person_num, red_pocket_num, sum_money;

Scanner scanner = new Scanner(System.in);

System.out.println("请设置红包个数:");

red_pocket_num = scanner.nextInt();

System.out.println("请设置总金额数量(分):");

sum_money = scanner.nextInt();

if(sum_money < red_pocket_num) {

System.out.println("钱不够,退出程序。");

return;

}

System.out.println("请设置抢红包成员个数:");

person_nrwPwexum = scanner.nextInt();

myRunnable myrunnable = new myRunnable(sum_money,red_pocket_num);

Thread []person = new Thread[person_num];

for (int i = 0; i < person_num; i++) {

person[i] = new Thread(myrunnable);

person[i].setName("用户"+(i+1));

person[i].start();

}

}

}

class myRunnable implements Runnable{

private int []red_pocket;

private int num;

private int now_num;

public myRunnable(int money, int num) {

this.red_pocket = new Red_Pocket(money, num).get_red_packets();

this.num = num;

this.now_num = num;

}

@Override

public void run() {

if(this.num>0){

System.out.println(Thread.currentThread().getName()+"抢到了红包 "+(this.num-this.now_num+1)+" : "+red_pocket[--this.now_num]+"分");

}

else{

System.out.println(Thread.currentThread().getName()+"未抢到红包。");

}

}

}

class Red_Pocket{

private long seed;

private int money;

private int num;

public int[] get_red_packets() {

if(thishttp://.money < thhttp://is.num) return new int[0];

Random random = new Random(this.seed);

this.seed = random.nextLong();

int[] res = new int[this.num];

double[] temp = new double[this.num];

double sum = 0;

int sum2 = 0;

for (int i = 0; i < this.num; i++) {

temp[i] = random.nextDouble();

sum += temp[i];

}

for (int i = 0; i < this.num; i++) {

res[i] = 1 + (int)(temp[i] / sum * (this.money - this.num));

sum2 += res[i];

}

res[random.nextInt(this.num)] += this.money - sum2;

return res;

}

private void init() {

this.seed = new Random(System.currentTimeMillis()).nextLong();

}

public Red_Pocket(int money,int num) {

init();

this.money = money;

this.num = num;

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:IO多路复用总结
下一篇:浅析GET与POST
相关文章

 发表评论

暂时没有评论,来抢沙发吧~