问题:应用多线程相关方法,实现微信多人抢红包,并将每人抢到的红包金额输出。
分析:JAVA作业4由此可进入中我写了一个模拟微信发红包的程序,这个作业也是在其基础上实现的,只是运用了一些多线程的知识。
代码运行截图:
具体实现代码:
第一部分:
import java.util.Random;
public class HongBao {
double total_money;//总钱数
int total_count; //红包总数
public HongBao(){}; //无参构造方法
public synchronized double getRandomMoney(){
Random c = new Random();
double val = 0;//用于记录每个人分配到的红包金额,初始化为0
if(total_money != 0 && total_count >= 1){
if(total_count/total_money == 0.01){
//剩下的每个人只能分到0.01的时候
val = 0.01;
//红包总钱数减去被领走的钱
total_money = total_money - val;
//红包总个数减1
total_count -= 1;
//返回每个人领到的钱数
return val;
}
if(total_count == 1){
//只有一个红包了
val = total_money; //领到的钱数就是当前的总钱数
}else{
double temp; //临时变量用于记录红包剩下的金额
while(true){
//随机生成领到的钱
double max = total_money - (total_count - 1) * 0.01;
double bound = max - 0.01;
//使每个人分到的钱尽可能的平均
val = (double) c.nextInt((int) (bound * 100)) / 100 + 0.01;
//红包剩下的金额相应改变
temp = total_money - val;
if(temp/(total_count-1) >= 0.01 && val > 0){
break;
}
}
total_money = total_money - val;
}
total_count -= 1;
}
return val; }
}
第二部分:
class UserThread implements Runnable {
HongBao hongBao;
public UserThread(HongBao hongBao) {
this.hongBao = hongBao;
}
@Override
public void run() {
double money = hongBao.getRandomMoney();
if (money == 0)
System.out.println(Thread.currentThread().getName() + "不好意思,没有抢到!");
else
System.out.println("恭喜哦!"+Thread.currentThread().getName() + "抢到 " + String.format("%.2f", money) + "元");
}
}
第三部分:
import java.util.Scanner;
public class QiangHongBao {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
HongBao hongBao =new HongBao();
System.out.print("please enter total_money:");
hongBao.total_money = sc.nextDouble();
System.out.print("please enter total_count:");
hongBao.total_count = sc.nextInt();
UserThread user = new UserThread(hongBao);
for(int i=1;i<9;i++) {
new Thread(user).start();
}
}
}