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

大体思路

红包的分发见JAVA作业——红包分发。
而抢红包要解决的是线程问题。
其实比较简单,设定好人数,每个人一个线程,每个线程执行一遍,有红包就抢,没有红包就抢不到,所以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_num = 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(this.money < this.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;
  }
}

到此这篇关于JAVA多线程抢红包的实现示例的文章就介绍到这了,更多相关JAVA多线程抢红包内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java实现抢红包功能

    本文实例为大家分享了Java实现抢红包功能的具体代码,供大家参考,具体内容如下 关键思想: 1.抢红包涉及多人并发操作,需要做好同步保证多线程运行结果正确. 2.由于同时在线人数大,从性能方面考虑,玩家的发红包请求不必及时响应,而由服务端定时执行发红包队列. 下面是主要的代码和实现逻辑说明 1.创建一个类,表示红包这个实体概念.直接采用原子变量保证增减同步.Java的原子变量是一种精度更细的同步机制,在高度竞争的情况下,锁的性能将超过原子变量的性能,但在更真实的竞争情况,原子变量享有更好的性能.

  • java多线程模拟抢红包功能

    今天有朋友问我一道面试题,有5个人抢5个红包,可重复抢,用多线程程序实现,实现方式有多种,分享一下我的思路:应用了阻塞队列的特性. /** * Created by zhanglinqiang on 2016/6/23. */ public class MyTest { public static void main(String[] args) throws InterruptedException { LinkedBlockingQueue<LuckyMoney> luckyMoneys

  • java实现微信抢红包算法

    简介 网上说的有两种比较公平的算法,一种是二倍均值法,一种是线段切割法.下面我们介绍下两种算法的实现: 二倍均值法 原理 剩余红包金额M,剩余人数N,那么:每次抢到金额=随机(0,M/N*2) 保证了每次随机金额的平均值是公平的 假设10人,红包金额100元 第一人:100/10*2=20,随机范围(0,20),平均可以抢到10元 第二人:90/9*2=20,随机范围(0,20),平均可以抢到10元 第三人:80/8*2=20,随机范围(0,20),平均可以抢到10元 以此类推,每次随机范围的均

  • java模拟微信抢红包的实例代码

    java简单模拟微信抢红包功能,本例发100元红包,有10个人抢,为了尽可能的公平,每个人的红包金额都要随机(保证结果的不确定性,本例抢红包的次序与红包金额匹配也随机),就是不能出现部分红包偏大部分偏小的情况,在区间0~100上随机生成9个节点,加0和100共11个节点按从小到大排序,各节点之间的差值就是红包金额,保证了红包金额之和等于100. public static void main(String[] args) { // 发100元红包,10人抢 // TODO Auto-genera

  • java实现抢红包算法(公平版和手速版)

    当我们在群里抢红包时真的是手速越快红包金额越大吗? 答案当然是并不是,都说了是拼手气,岂能是拼手速! 不过也可以有拼手速的方法 抢红包 二倍均值法(公平版) 线段切割法(手速版) 二倍均值法(公平版) 这是一种很合理很公平的抢红包算法了,绝对不会让你拼手速的,就别天真了. 在此我们假设 红包剩余金额为 M 红包剩余数量为 N 这种算法就是每次都在区间[0,M/N×2] 随机取一个数 假设100元红包发10个人,那么合理的做法应该是每个人领到10元的概率相同. 第一个人随机金额的范围为[0,100

  • JAVA随机数随机字母的实现(微信抢红包小练习)

    今天我们谈一谈JAVA中的随机数 随机数 --Math.random() 0.0 在Math类中存在一个random()方法,用于产生随机数字,这个方法生成在0.0<=生成数<1.0 0.1那么它默认的生成的数显然在有些时候是满足不了我们的,我们来看看它的升级版 类型 返回值 (int)(Math.Random()*n) 0<=返回值<n m+(int)(Math.Random()*n) m<=返回值<m+n 随机数 --字母 0.2 使用Math类的random()

  • JAVA实现简单抢红包算法(模拟真实抢红包)

    闲来无事,最近项目需求要写出用户登录首页来发现金红包,没有限额.我就自己稍微计算了一下如果有限额该怎么写.觉得这样与微信红包差不多.等项目需求完成以后.正好来博客贴一下我自己写的拆红包算法.个人觉得这个算法比较模拟现实抢红包规则.废话少说.先贴代码; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.ut

  • Java抢红包的红包生成算法

    马上过年了.过年微信红包很火,最近有个项目也要做抢红包,于是写了个红包的生成算法. 红包生成算法的需求 预先生成所有的红包还是一个请求随机生成一个红包 简单来说,就是把一个大整数m分解(直接以"分为单位,如1元即100)分解成n个小整数的过程,小整数的范围是[min, max]. 最简单的思路,先保底,每个小红包保证有min,然后每个请求都随机生成一个0到(max-min)范围的整数,再加上min就是红包的钱数. 这个算法虽然简单,但是有一个弊端:最后生成的红包可能都是min钱数的.也就是说可能

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

    大体思路 红包的分发见JAVA作业--红包分发. 而抢红包要解决的是线程问题. 其实比较简单,设定好人数,每个人一个线程,每个线程执行一遍,有红包就抢,没有红包就抢不到,所以run函数中只要判断现在还有没有红包就可以了. 代码实现 import java.util.Random; import java.util.Scanner; public class Main { public static void main(String[] args) { int person_num, red_po

  • java多线程入门知识及示例程序

    为什么需要多线程?模型的简化,如某些程序是由多个相对独立任务的运行: 图形界面的出现,输入.输出的阻塞 多核CPU的更好利用 异步行为的需要 Java多线程的特性: 程序的入口main本身是一个线程 线程是并发的,无序执行的 线程内部是顺序执行的 共享数据 Java多线程的风险: 安全风险:由于线程的操作顺序是不确定的,某些在单线程下能运行的程序到多线程下会出现意外的结果. 性能风险:服务器的吞吐量.响应性.资源消耗 Java多线程API: Java可以通过两种形式创建线程:一.实现Runnab

  • java多线程返回值使用示例(callable与futuretask)

    Callable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功能更强大一些,被线程执行后,可以返回值,这个返回值可以被Future拿到,也就是说,Future可以拿到异步执行任务的返回值,下面来看一个简单的例子 复制代码 代码如下: package com.future.test; import java.io.FileNotFoundException;import java.io.IOException;i

  • Java多线程中线程的两种创建方式及比较代码示例

    1.线程的概念:线程(thread)是指一个任务从头至尾的执行流,线程提供一个运行任务的机制,对于java而言,一个程序中可以并发的执行多个线程,这些线程可以在多处理器系统上同时运行.当程序作为一个应用程序运行时,java解释器为main()方法启动一个线程. 2.并行与并发: (1)并发:在单处理器系统中,多个线程共享CPU时间,而操作系统负责调度及分配资源给它们. (2)并行:在多处理器系统中,多个处理器可以同时运行多个线程,这些线程在同一时间可以同时运行,而不同于并发,只能多个线程共享CP

  • Java编程利用socket多线程访问服务器文件代码示例

    这篇文章将向大家展示Java编程利用socket多线程访问服务器文件代码示例,如果您想先了解Java多线程socket编程的基础知识,可以看下这篇文章:Java多线程编程实现socket通信示例代码. 接下来进入正文,我们看看利用socket多线程访问服务器代码: ServerMain.java package com.ysk.webServer; import java.io.File; import java.io.IOException; import java.net.ServerSoc

  • Java多线程并发开发之DelayQueue使用示例

    在学习Java 多线程并发开发过程中,了解到DelayQueue类的主要作用:是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走.这种队列是有序的,即队头对象的延迟到期时间最长.注意:不能将null元素放置到这种队列中. Delayed,一种混合风格的接口,用来标记那些应该在给定延迟时间之后执行的对象.此接口的实现必须定义一个 compareTo 方法,该方法提供与此接口的 getDelay 方法一致的排序. 在网上看到了一些

  • Java多线程编程实现socket通信示例代码

    流传于网络上有关Java多线程通信的编程实例有很多,这一篇还算比较不错,代码可用.下面看看具体内容. TCP是Tranfer Control Protocol的 简称,是一种面向连接的保证可靠传输的协议.通过TCP协议传输,得到的是一个顺序的无差错的数据流.发送方和接收方的成对的两个socket之间必须建 立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以

  • java 多线程-锁详解及示例代码

    自 Java 5 开始,java.util.concurrent.locks 包中包含了一些锁的实现,因此你不用去实现自己的锁了.但是你仍然需要去了解怎样使用这些锁. 一个简单的锁 让我们从 java 中的一个同步块开始: public class Counter{ private int count = 0; public int inc(){ synchronized(this){ return ++count; } } } 可以看到在 inc()方法中有一个 synchronized(th

  • Java多线程饥饿与公平介绍及代码示例

    如果一个线程因为CPU时间全部被其他线程抢走而得不到CPU运行时间,这种状态被称之为"饥饿".而该线程被"饥饿致死"正是因为它得不到CPU运行时间的机会.解决饥饿的方案被称之为"公平性" – 即所有线程均能公平地获得运行机会. 下面是本文讨论的主题: Java中导致饥饿的原因 在Java中,下面三个常见的原因会导致线程饥饿: 高优先级线程吞噬所有的低优先级线程的CPU时间. 线程被永久堵塞在一个等待进入同步块的状态,因为其他线程总是能在它之前持续

随机推荐