天天看點

java基礎多線程搶紅包_我用java寫的搶紅包用的紅包類,支援多線程

import java.util.concurrent.atomic.AtomicInteger;

public class CashGift {

public static class OverException extends Exception {

}

private final int totalNumber;

private final float totalMoney;

private final AtomicInteger index = new AtomicInteger();

long p1, p2, p3, p4, p5, p6, p7;

private volatile int realIndex;

private volatile float remainMoney;

public CashGift(int totalNumber, float totalMoney) {

this.totalNumber = totalNumber;

this.totalMoney = totalMoney;

realIndex = 1;

remainMoney = totalMoney;

}

protected float rand(float x) {

return (float)(Math.random() * x);

}

protected float getMoney(int i) {

if (i < totalNumber) {

float j = totalNumber + 1 - i;

return rand(2 / j) * remainMoney * j / 2;

} else {

return remainMoney;

}

}

public float get() throws OverException {

int ticket = index.incrementAndGet();

if (ticket > totalNumber) {

throw new OverException();

} else {

for (;;) {

if (ticket == realIndex) {

float money = getMoney(realIndex);

remainMoney -= money;

realIndex++;

return money;

}

}

}

}

}

測試代碼,8G記憶體,Xeon E5-2630處理器,以下測試代碼跑的時間為15155466407ns。

final CashGift[] cgList = new CashGift[10000];

for (int i = 0; i < cgList.length; i++) {

cgList[i] = new CashGift(100, 10000);

}

Runnable qianghongbao = new Runnable() {

@Override

public void run() {

int i = 0;

while (i < cgList.length) {

try {

cgList[i].get();

} catch(CashGift.OverException e) {

i++;

}

}

}

};

System.out.println("Starting...");

int number = 100;

final Thread[] people = new Thread[number];

long start = System.nanoTime();

for (int i = 0; i < people.length; i++) {

people[i] = new Thread(qianghongbao);

people[i].start();

}

for (int i = 0; i < people.length; i++) {

people[i].join();

}

System.out.println(System.nanoTime() - start);

int i;

for (i = 0; i < cgList.length; i++) {

if (!cgList[i].isEmpty()) {

System.out.println("Failed!");

break;

}

}

if (cgList.length == i)

System.out.println("Successed!");