Java多线程实现简易微信发红包的方法实例

一、

首先我们先大致了解一下什么是多线程。(书上的解释)

程序是一段静态的代码,它是应用软件的蓝本。进程是程序的一次动态执行过程,对应了从代码加载执行,执行到执行完毕的一个完整的过程。

线程不是进程,线程是比进程更小的执行单位,一个进程在其执行过程中,可以产生多个线程形成多条执行线索,每条线索即每个线程也有它自身的产生,存在,消亡的过程,和进程共享操作系统的资源类似,线程间也可以共享进程中的某些内存单元,并利用这些共享单元来实现数据交换,实时通信与必要的同步操作,但与进程不同的是线程的中断和恢复更加节省开支。线程是运行在进程中的“小进程”。

多线程是指一个应用程序中同时存在几个执行体,按几条不同的执行线索共同工作的情况。虽然看似是几个事件同时发生,但其实计算机在任何给定时刻只能执行那些线程中的一个。为了建立这些线程在同步进行的感觉,Java虚拟机快速的把控制从一个线程切换到另一个线程。这些线程将被轮流执行,使得每个线程都有机会使用CPU资源。

二、

利用单线程实现的简易微信发红包

共写有三种方法,其中第一种,第二种未设置范围,红包数和人数为一一对应,第三种增添了取值范围以及计数器,人多红包少有未抢到现象发生。

(1) 方法一

import java.util.Scanner;
import com.sun.deploy.security.SelectableSecurityManager;
import java.util.Random;

public class 简易微信发红包 {
 public static void main(String[] args) {
  Scanner scanner=new Scanner(System.in);
  int n;
  double money;
  System.out.println("请输入您想要发的红包数量");
  n=scanner.nextInt();
  System.out.println("请输入您发送的红包金额");
  money=scanner.nextDouble();
  T2 t2=new T2(n,money);
  t2.Rob();
 }
}
class T2 {
 public double remain;//有红包被领取后的余额
 int n;//红包数量

 T2(int n,double money) {
  this.remain=money;
  this.n=n;

 }
 int a=1;
 public void Rob() {

  while (n > 0) {
   double x2;

   if (n != 1) {//因为最后一个人领取金额为前面人领取红包后剩下的,所以无需再进行随机
    x2 = process();//取随机金额
    while (judge(x2) != 1) {//判断取到的随机金额是否非法,即无法保证后来每个红包领取者领到最低金额0.01
     x2 = process();//若非法则重新取随机金额
    }

    remain = remain - x2;//当领取成功后余额减去领走的金额
    n--;//确保每次判断人数为所剩红包数减1
    System.out.println("红包获得者" + a + "获得" + x2 + "元");//此处默认领取者顺序为升序
    a++;//控制输出顺序
   }
   else {
    x2 = remain;//因为最后一个人领取金额为前面人领取红包后剩下的,所以无需再进行随机
    String str = String.valueOf(x2);
    String str1 = String.format("%.2f", x2);
    x2 = Double.parseDouble(str1);
    System.out.println("红包获得者" + a + "获得" + x2 + "元");
    n--;//确保每次判断人数为所剩红包数减1
   }

  }

 }
 public int judge(double x){//判断函数
  if(remain-x>(n-1)*0.01){//确保后来红包领取者最少能领到最低金额0.01

   return 1;
  }
  else return 0;
 }

 public double process() {//实现红包金额随机的函数
  double x2;
  double x1;
  String str1;
  Random random = new Random();//随机数为取0到1之间的任意double值
  x1 = remain*random.nextDouble();
   str1= String.format("%.2f",x1);//转化成字符串型用字符串型的format进行格式化处理,红包金额最多取到小数点后两位
  x2=Double.parseDouble(str1);//再将字符串型数据转换成double型
  while(x2==0){//如果所取金额非法则回炉重造
   x1 = remain*random.nextDouble();
   str1= String.format("%.2f",x1);//转化成字符串型用字符串型的format进行格式化处理,红包金额最多取到小数点后两位
   x2=Double.parseDouble(str1);//再将字符串型数据转换成double型
  }
  return x2;

 }
}

程序运行结果如下

(2) 方法二

import java.util.Random;
import java.util.Scanner;

public class 简易微信发红包2 {
 public static void main(String[] args) {
  Scanner scanner=new Scanner(System.in);
  double money=0;//红包总金额
  int n;//红包个数
  System.out.println("请输入您想要发的红包数量");
  n=scanner.nextInt();
  System.out.println("请输入您发送的红包金额");
  money=scanner.nextDouble();
  if(money/n==0.01){//当所发金额刚好为每人0.01元时
   T6 t6=new T6(money,n);
   t6.Rob();
  }else{
   T5 t5=new T5(money,n);
   t5.Rob();
  }
 }
}
class T5{
 double remain;

 int n;
 T5(double money,int n){
  this.remain=money;
  this.n=n;
 }
 int a=1;
 public void Rob(){

  double max;//最大可领红包金额
  double x1;//随机金额
  double x2;//所得金额

while(n>0) {
 if (n != 1) {//前n-1个红包领取者领的红包为随机金额红包
  max = remain - (n - 1) * 0.01;//最大可领红包金额为剩下的人都获得最小金额0.01
  Random random = new Random();
  x1 = (double) random.nextInt((int) ((max - 0.01) * 100));
  //用nextInt而不用nextDouble的原因是nextDouble无法设置seed
  //上式中max-0.01,下面的x2+0.01即解决了随机数取0导致红包获得者没抢到钱的问题
  x1 /= 100.0;
  x2 = x1 + 0.01;
  remain = remain - x2;
  n--;
  System.out.println("红包获得者" + a + "获取金额为:" + String.format("%.2f", x2) + "元");
  a++;
 } else {//最后一人领的红包为前n-1个人领完后剩下的红包

  System.out.println("红包获得者" + a + "获取金额为:" + String.format("%.2f", remain) + "元");
  n--;
 }
}

}
 }

class T6 {
 double remain;
 int n;
 T6(double money,int n){
  this.remain=money;
  this.n=n;
 }

 public void Rob(){
  for(int i=1;i<=n;i++){
   System.out.println("红包获得者"+i+"获得了0.01元");

  }
 }
}

程序运行结果如下:


(3) 方法三

import java.util.Random;
import java.util.Scanner;

public class 简易微信发红包3 {
  public static void main(String[] args) {
    int p,n;
    double money;
    System.out.println("请输入您发送的红包金额");
    Scanner scanner=new Scanner(System.in);
    money=scanner.nextDouble();
    System.out.println("请输入您发送的红包数量");
    n=scanner.nextInt();
    System.out.println("请输入参与抢红包的人数");
    p=scanner.nextInt();
    T7 t7=new T7(money,n,p);
    t7.Rob();
  }
}

class T7 {

  double money;
  int n,p;
  int count =0;//计数器
  double remain;
 T7(double money,int n,int p){
    this.money=money;//总金额
    this.n=n;//红包数
   this.p=p;//抢红包人数
    this.remain=money;//所剩金额
  }

  public void Rob() {
    for(int i=1;i<=p;i++) {
      double x1, x2, d;
      String s1, s2;

      Random random = new Random();
      d = money / (n - 1);//设置范围让每次所得金额不超过总数的1/(n-1),这样也就避免了一次取得过大导致后面抢的红包不能保证每个最少0.01
      x1 = d * random.nextDouble();
      s1 = String.format("%.2f", x1);//转化成字符串型用字符串型的format进行格式化处理,红包金额最多取到小数点后两位
      x1 = Double.parseDouble(s1);//再将字符串型数据转换成double型
      while (x1 == 0 || x1 == money / (n - 1)) {
        x1 = d * random.nextDouble();
        s1 = String.format("%.2f", x1);//转化成字符串型用字符串型的format进行格式化处理,红包金额最多取到小数点后两位
        x1 = Double.parseDouble(s1);//再将字符串型数据转换成double型
      }
      s2 = String.format("%.2f", remain);//转化成字符串型用字符串型的format进行格式化处理,红包金额最多取到小数点后两位
      remain = Double.parseDouble(s2);//再将字符串型数据转换成double型

      if (count < n - 1) {//前n-1个红包金额为随机金额
        System.out.println( "红包抢夺者"+i+ "抢到了" + s1 + "元");
        remain -= x1;
        count++;
      } else if (count == n - 1) {//第n个为前n-1个红包抢完所剩金额
        System.out.println( "红包抢夺者"+i+ "抢到了" + s2 + "元");
        count++;
      } else if (count > n - 1) {//红包被抢完后再来的
        System.out.println( "红包抢夺者"+i+ "哎呀,手慢了!没抢到!");
        count++;
      }
    }
  }
}

程序运行结果如下:

三、

利用多线程实现的简易微信发红包

那么如何创建多线程呢?

1.通过继承thread类创建多线程

JDK中提供了一个线程类Thread,通过继承Thread类,并重写Thread类中的run()方法便可实现多线程。

在Thread类中,提供了一个start()方法用于启动新线程,线程启动后,系统会自动调用run()方法,如果子类重写了该方法便会执行子类中的方法。

run()方法中就是写能够被线程执行的程序。如果直接调用则相当于普通方法,必须使用start()方法,才能启动线程,然后再由JVM去调用该线程的run()方法。

创建并启动多线程的步骤

①定义Thread类的子类,并重写该类的run方法,其方法体代表线程需要完成的任务。因此常把run方法称为线程执行体。

②创建Thread子类的实例,即创建线程对象。

③用线程对象的start方法来启动该线程。

2.通过实现Runnable接口创建多线程

通过继承Thread类实现了多线程,但是这种方式有一定的局限性。因为Java中只支持单继承,一个类一旦继承了某个父类就无法再继承Thread类。

Thread类提供了另外一个构造方法Thread(Runnable target),其中Runnable是一个接口,它只有一个run()方法。

当通过Thread(Runnable target))构造方法创建线程对象时,只需为该方法传递一个实现了Runnable接口的实例对象,这样创建的线程将调用实现了Runnable接口中的run()方法作为运行代码,而不需要调用Thread类中的run()方法。

创建并启动多线程的步骤

①定义Runnable接口的实现类,并重写该接口的run方法,该run方法的方法体同样是该线程的线程执行体。

②创建Runnable实现类的实例,并以此为实例作为Thread的参数来创建Thread对象,该Thread对象才是真正的线程对象。

当多个线程使用同一个共享资源时,可以将处理共享资源的代码放置在一个代码块中,使用synchronized关键字来修饰,被称作同步代码块

sychronized(lock){
操作共享资源代码块
}

其中:lock是一个锁对象,它是同步代码块的关键。当线程执行同步代码块时,首先会检查锁对象的标志位,默认情况下,标志位为1,此时线程会执行同步代码块,同时将锁对象的标志位置为0。当一个新的线程执行到这段同步代码块时,由于锁对象的标志位为0,新线程会发生阻塞,等待当前线程执行完同步代码块后,锁对象的标志位被置为1,新线程才能进入同步代码块执行其中的代码。循环往复,直到共享资源被处理完为止。

同步代码块可以有效解决线程的安全问题,当把共享资源的操作放在synchronized定义的区域内时,便为这些操作加了同步锁。

在方法前面同样可以使用synchronized关键字来修饰,被修饰的方法为同步方法,它能实现和同步代码块同样的功能,具体语法格式如下:

synchronized 返回值类型 方法名 {}

被synchronized修饰的方法在某一时刻只允许一个线程访问,访问该方法的其它线程都会发生阻塞,直到当前线程访问完毕后,其它线程才有机会执行方法。

另外

public final String getName():获取线程的名称。

public static Thread currentThread():返回当前正在执行的线程对象,这样就可以获取任意方法所在的线程名称。

Thread.currentThread().getName()

现将上面的单线程改成多线程实现

本篇文章多线程的创建以及实现用Runnable接口实现

(1)

import java.util.Scanner;
import com.sun.deploy.security.SelectableSecurityManager;
import java.util.Random;

public class 微信发红包多线程 {
  public static void main(String[] args) {
    Scanner scanner=new Scanner(System.in);
    int n;
    double money;
    System.out.println("请输入您想要发的红包数量");
    n=scanner.nextInt();
    System.out.println("请输入您发送的红包金额");
    money=scanner.nextDouble();
    T3 t3=new T3(n,money);//创建runnable实现类的实例
    for (int j = 1; j <= n; j++) {
      new Thread(t3, "红包获得者" + j).start();//以上面创建的实例作为Thread的参数来创建Thread对象,并为Thread对象指定一个名字,用线程对象的start方法来启动该线程。
    }
  }
}
class T3 implements Runnable {//实现runnable接口
  public double remain;//有红包被领取后的余额
  int n;//红包数量

  public synchronized void run() {//同步方法,在某一时刻只允许一个线程访问,防止数据错乱

    Rob();
  }

  T3(int n, double money) {
    this.remain = money;
    this.n = n;

  }

  int a = n;

  public void Rob() {

    double x2;

    if (n != 1) {//因为最后一个人领取金额为前面人领取红包后剩下的,所以无需再进行随机
      x2 = process();//取随机金额
      while (judge(x2) != 1) {//判断取到的随机金额是否非法,即是否能保证后来每个红包领取者领到最低金额0.01
        x2 = process();//若非法则重新取随机金额
      }
      remain = remain - x2;//当领取成功后余额减去领走的金额
      n--; //确保每次判断人数为红包数减一

    } else {
      x2 = remain;//因为最后一个人领取金额为前面人领取红包后剩下的,所以无需再进行随机
      String str = String.valueOf(x2);
      String str1 = String.format("%.2f", x2);
      x2 = Double.parseDouble(str1);

    }

    Thread th = Thread.currentThread();//返回当前正在执行的线程对象
    String th_name = th.getName();//获取线程的名称
    System.out.println(th_name + "抢到" + x2 + "元");
  }

  public int judge(double x) {//判断函数
    if (remain - x > (n - 1) * 0.01) {//确保后来红包领取者能领到最低金额0.01

      return 1;
    } else return 0;
  }

  public double process() {//实现红包金额随机的函数
    double x2;
    double x1;
    String str1;
    Random random = new Random();//随机数为取0到1之间的任意double值
    x1 = remain * random.nextDouble();
    str1 = String.format("%.2f", x1);//转化成字符串型用字符串型的format进行格式化处理,红包金额最多取到小数点后两位
    x2 = Double.parseDouble(str1);//再将字符串型数据转换成double型
    while (x2 == 0) {//如果所取金额非法则回炉重造
      x1 = remain * random.nextDouble();
      str1 = String.format("%.2f", x1);//转化成字符串型用字符串型的format进行格式化处理,红包金额最多取到小数点后两位
      x2 = Double.parseDouble(str1);//再将字符串型数据转换成double型
    }
    return x2;
  }
}

程序运行结果如下:

(2)

import java.util.Random;
import java.util.Scanner;

public class 简易微信发红包多线程2 {
  public static void main(String[] args) {
    Scanner scanner=new Scanner(System.in);
    double money=0;//红包总金额
    int n;//红包个数
    System.out.println("请输入您想要发的红包数量");
    n=scanner.nextInt();
    System.out.println("请输入您发送的红包金额");
    money=scanner.nextDouble();
    if(money/n==0.01){//当所发金额刚好为每人0.01元时
      T4 t4=new T4(money,n);
      for(int i=1;i<=n;i++) {
        new Thread(t4,"红包获得者"+i).start();
      }
    }else{
    T1 t1=new T1(money,n);
      for(int i=1;i<=n;i++) {
        new Thread(t1,"红包获得者"+i).start();
      }
  }
  }
}
class T1 implements Runnable{
  double remain;

  int n;
  T1(double money,int n){
    this.remain=money;
    this.n=n;
  }
  @Override
  public synchronized void run() {

    Rob();
  }
  public void Rob(){

    double max;//最大可领红包金额
    double x1;//随机金额
    double x2;//所得金额

    if(n!=1) {//前n-1个红包领取者领的红包为随机金额红包
      max=remain-(n-1)*0.01;//最大可领红包金额为剩下的人都获得最小金额0.01
      Random random=new Random();
     x1=(double)random.nextInt((int) ((max-0.01)*100));
     //用nextInt而不用nextDouble的原因是nextDouble无法设置seed
     //上式中max-0.01,下面的x2+0.01即解决了随机数取0导致红包获得者没抢到钱的问题
      x1/=100.0;
      x2=x1+0.01;
      remain=remain-x2;
      n=n-1;
      Thread th=Thread.currentThread();//获取当前线程
      String th_name=th.getName();//获取线程名字
      System.out.println(th_name+"获取金额为:"+String.format("%.2f", x2)+"元");
    }
    else {//最后一人领的红包为前n-1个人领完后剩下的红包
      Thread th=Thread.currentThread();//获取当前线程
      String th_name=th.getName();//获取线程名字
      System.out.println(th_name+"获取金额为:"+String.format("%.2f", remain)+"元");
    }

  }
}

class T4 implements Runnable{
  double remain;
  int n;
  T4(double money,int n){
    this.remain=money;
    this.n=n;
  }
  public synchronized void run() {
    Rob();
  }
  public void Rob(){
    Thread th=Thread.currentThread();//获取当前线程
    String th_name=th.getName();//获取线程名字
    System.out.println(th_name+"获取金额为:"+String.format("%.2f", remain/n)+"元");
  }
}

程序运行结果如下:


(3)

import java.util.Random;
import java.util.Scanner;

public class 简易微信发红包多线程3 {
  public static void main(String[] args) {
    int p,n;
    double money;
    System.out.println("请输入您发送的红包金额");
    Scanner scanner=new Scanner(System.in);
    money=scanner.nextDouble();
    System.out.println("请输入您发送的红包数量");
    n=scanner.nextInt();
    System.out.println("请输入参与抢红包的人数");
    p=scanner.nextInt();
    HH hh=new HH(money,n);
    for (int i=1;i<=p;i++){
      new Thread(hh,"第"+i+"个人").start();
    }
  }
}

class HH implements Runnable{

  double money;
  int n;
  int count =0;//计数器
  double remain;
  HH(double money,int n){
    this.money=money;//总金额
    this.n=n;//红包数
    this.remain=money;//所剩金额
  }
  @Override
  public synchronized void run() {
    Rob();
  }
  public void Rob(){

    double x1,x2,d;
    String s1,s2;
    Thread th=Thread.currentThread();//获取当前线程
    String th_name=th.getName();//获取线程名字
    Random random=new Random();
    d=money/(n-1);//设置范围让每次所得金额不超过总数的1/(n-1),这样也就避免了一次取得过大导致后面抢的红包不能保证每个最少0.01
   x1=d*random.nextDouble();
    s1=String.format("%.2f",x1);//转化成字符串型用字符串型的format进行格式化处理,红包金额最多取到小数点后两位
    x1 = Double.parseDouble(s1);//再将字符串型数据转换成double型
   while(x1==0||x1==money/(n-1)){
      x1=d*random.nextDouble();
     s1=String.format("%.2f",x1);//转化成字符串型用字符串型的format进行格式化处理,红包金额最多取到小数点后两位
     x1 = Double.parseDouble(s1);//再将字符串型数据转换成double型
   }
    s2= String.format("%.2f",remain);//转化成字符串型用字符串型的format进行格式化处理,红包金额最多取到小数点后两位
    remain = Double.parseDouble(s2);//再将字符串型数据转换成double型

    if (count<n-1){//前n-1个红包金额为随机金额
      System.out.println(th_name+"抢到了"+s1+"元");
      remain-=x1;
      count++;
    }else if (count==n-1){//第n个为前n-1个红包抢完所剩金额
      System.out.println(th_name+"抢到了"+s2+"元");
      count++;
    }else if (count>n-1){//红包被抢完后再来的
      System.out.println(th_name+"哎呀,手慢了!没抢到!");
      count++;
    }
  }

}

程序运行结果如下:

总结

新手上路,因能力有限,若有不足之处还望大家海涵!

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

(0)

相关推荐

  • java多线程编程实例

    一.相关知识: Java多线程程序设计到的知识: (一)对同一个数量进行操作 (二)对同一个对象进行操作 (三)回调方法使用 (四)线程同步,死锁问题 (五)线程通信 等等 二.示例一:三个售票窗口同时出售20张票; 程序分析: 1.票数要使用同一个静态值 2.为保证不会出现卖出同一个票数,要java多线程同步锁. 设计思路: 1.创建一个站台类Station,继承Thread,重写run方法,在run方法里面执行售票操作!售票要使用同步锁:即有一个站台卖这张票时,其他站台要等这张票卖完! 2.

  • Java实现微信发红包

    前言 红包文化源远流长.从古时的红色纸包,到手机App中的手气红包,红包作为一种独特的中华文化传承至今.之前的所有内容中,综合Java这方面的知识,可以模拟发普通红包.那么这篇博客,我将整合之前介绍的所有的技术和知识,编写一个带界面版的 发红包 案例. 需求分析 分析并使用已给出的类,编写程序,设置红包类型. 小贴士 红包类型: 1.普通红包:金额均分.不能整除的,余额添加到最后一份红包中. 2.手气红包:金额随机.各个红包金额累和与总金额相等. 红包场景: 此案例是模拟群主给群成员发红包,群主

  • Java基于ArrayList实现群主发红包功能

    群主发普通红包,某群有多名成员,群主给成员发普通红包,普通红包的规则: 群主的一笔金额,从群主余额中扣除,平均分成n等份,让成员领取: 成员领取红包后,保存到成员余额中. 请根据描述,完成案例中所有类的定义以及指定类之间的继承关系,并完成发红包的操作. 根据题目可以稍作分析,群主和普通群成员都隶属于用户类,那么久可以建立一个用户类,用户类的属性可以有用户名,金额或者钱包,如下: package day05_after03; /** * 定义成员类 * * @author liuwenlong *

  • Java实现发红包功能

    Java发红包案例,供大家参考,具体内容如下 首先我们需要分析这个代码的架构是什么,需要什么类组成等. 我们需要建立4个类,这4个类分别是用户类.群主类.成员类,运行类: 因为群主类和成员类都有共同的特点--------拥有名字和余额,所以需要用户类去存储名字与余额 第一步:我们需要建立一个用户类,里面存储的是名字和余额 package Java.RedPacketCode; public class UserClass { private String name; private int ba

  • Java多线程的用法详解

    1.创建线程 在Java中创建线程有两种方法:使用Thread类和使用Runnable接口.在使用Runnable接口时需要建立一个Thread实例.因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例.Thread构造函数: public Thread( );  public Thread(Runnable target);  public Thread(String name);  public Thread(Runnable target

  • java多线程和并发包入门示例

    一.java多线程基本入门java多线程编程还是比较重要的,在实际业务开发中经常要遇到这个问题. java多线程,传统创建线程的方式有两种. 1.继承自Thread类,覆写run方法. 2.实现Runnable接口,实现run方法. 启动线程的方法都是调用start方法,真正执行调用的是run方法.参考代码如下: 复制代码 代码如下: package com.jack.thread; /** * 线程简单演示例子程序 *  * @author pinefantasy * @since 2013-

  • Java多线程的实现方式比较(两种方式比较)

    先看一下java线程运行时各个阶段的运行状态 线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源.一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行.由于线程之间的相互制约,致使线程在运行中呈现出间断性. 在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位.由于线程比进程更小,基本上不拥有系统资源,故对它的

  • 基于java实现简单发红包功能

    本文实例为大家分享了java实现简单发红包的具体代码,供大家参考,具体内容如下 这个案例是普通红包,均分的,不是拼手气红包. package nuc.edu.day01.demo05; /** * @author Administrator * 用户类 */ public class User { private String name; private Double money; public User() { } //显示当前余额 public void show(){ System.out

  • Java多线程实现简易微信发红包的方法实例

    一. 首先我们先大致了解一下什么是多线程.(书上的解释) 程序是一段静态的代码,它是应用软件的蓝本.进程是程序的一次动态执行过程,对应了从代码加载执行,执行到执行完毕的一个完整的过程. 线程不是进程,线程是比进程更小的执行单位,一个进程在其执行过程中,可以产生多个线程形成多条执行线索,每条线索即每个线程也有它自身的产生,存在,消亡的过程,和进程共享操作系统的资源类似,线程间也可以共享进程中的某些内存单元,并利用这些共享单元来实现数据交换,实时通信与必要的同步操作,但与进程不同的是线程的中断和恢复

  • php版微信公众号接口实现发红包的方法

    本文实例讲述了php版微信公众号接口实现发红包的方法.分享给大家供大家参考,具体如下: 最近接到一个任务,需要用微信来给用户自动发红包.要完成这个任务需要这么已经一些物料 微信商户号,已申请微信支付 微信商户号主体下面的微信公众号 先看一下效果图 只需要完成后面几步就可以了. 在微信公众号服务器上面调用红包代码 /* **微信红包功能 */ public function sendredpack(){ $re_openid = $this->_pg('re_openid'); $inputObj

  • PHP实现微信发红包程序

    使用PHP发红包,当我们输入红包数量和总金额后,PHP会根据这两个值进行随机分配每个金额,保证每个人都能领取到一个红包,每个红包金额不等,就是要求红包金额要有差异,所有红包金额总额应该等于总金额. 查看演示                        下载源码 首先给大家分析下规律. 设定总金额为10元,有N个人随机领取: N=1 第一个 则红包金额=X元: N=2 第二个 为保证第二个红包可以正常发出,第一个红包金额=0.01至9.99之间的某个随机数. 第二个红包=10-第一个红包金额:

  • php版微信发红包接口用法示例

    本文实例讲述了php版微信发红包接口用法.分享给大家供大家参考,具体如下: 微信红包功能我相信各位朋友都知道吧,但如果我们要把红包集成到网站那么要如何来做呢?这里小编就来为各位分享一个php 微信发红包接口测试实例,希望文章能够帮助到各位朋友 下面是一个类,使用方法: $arr['openid']='ojgTTt8oF9VdYcGsJMACHpA-jy1U'; $arr['hbname']="提现申请"; $arr['body']="您的提现申请已经成功"; $ar

  • php实现微信发红包功能

    本文实例为大家分享了php实现微信发红包功能的具体代码,供大家参考,具体内容如下 微信商家后台-现金红包开发: <?php class wxPay { //配置参数信息 const SHANGHUHAO = "1430998xxx";//商户号 const PARTNERKEY = "leFyTOXWzUEXxfp47WOu5d9xxxxxx"; //api,商户后台 //核心支付函数,参数:请求地址和参数 function pay($url,$obj) {

  • AccessibilityService实现微信发红包功能

    在AccessibilityService中我们可以做模拟操作,下面记述下通过AccessibilityService实现微信发红包的功能 1.配置AccessibilityService,需要通过集成AccessibilityService来执行操作. public class TestAccessibilityService extends AccessibilityService { @Override public void onAccessibilityEvent(Accessibil

  • java多线程学习之死锁的模拟和避免(实例讲解)

    1.死锁 死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放.由于线程被无限期地阻塞,因此程序不可能正常终止. Java 死锁产生的四个必要条件: 1.互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用 2.不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放. 3.请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有. 4.循环等待,即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的

  • Java多线程之如何确定线程数的方法

    关于多线程的线程数的确定,最近研读过几篇paper,在此做一下笔记,方便使用时翻看. 1.<Java 虚拟机并发编程>中介绍 就是说:线程数 = CPU的核心数 * (1 - 阻塞系数) 另一篇:<Java Concurrency in Practice>即<java并发编程实践>,给出的线程池大小的估算公式: Nthreads=Ncpu*Ucpu*(1+w/c),其中 Ncpu=CPU核心数,Ucpu=cpu使用率,0~1:W/C=等待时间与计算时间的比率 仔细推敲两

  • JAVA多线程之中断机制及处理中断的方法

    目录 一,介绍 二,中断及如何响应中断? 一,介绍 这篇文章主要记录使用 interrupt() 方法中断线程,以及如何对InterruptedException进行处理.感觉对InterruptedException异常进行处理是一件谨慎且有技巧的活儿. 由于使用stop()方法停止线程非常的暴力,人家线程运行的好好的,突然就把人家杀死了,线程占用的锁被强制释放,极易导致数据的不一致性.可参考这篇文章对stop()方法的介绍. 因此,提出了一种温和的方式:请求另外一个线程不要再执行了,这就是中

随机推荐