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!");