import jvstm.*;
import pt.ist.esw.atomicannotation.Atomic;
import java.util.Random;
import java.util.concurrent.*;
public class StressTest {
private VBox<Long>[] nums;
public StressTest(int num) {
nums = new VBox[num];
for (int i = 0; i < num; i++) {
nums[i] = new VBox<Long>(0L);
}
}
void start(int numThreads) {
Executor executor = Executors.newFixedThreadPool(numThreads);
for (int i = 0; i < numThreads; i++) {
executor.execute(new Worker());
}
}
class Worker implements Runnable {
private Random rnd = new Random();
public void run() {
while (true) {
long total = sumAll();
// if (total == 1000) {
// System.out.println("Found one 1000!!!");
// }
changeOne(total < 1000);
}
}
@Atomic long sumAll() {
long sum = 0;
for (int i = 0; i < nums.length; i++) {
sum += nums[i].get();
}
return sum;
}
@Atomic void changeOne(boolean inc) {
int pos = rnd.nextInt(nums.length);
long val = nums[pos].get() + (inc ? 1 : -1);
nums[pos].put(val);
}
}
public static void main(String[] args) throws Exception {
Thread.sleep(5000);
System.out.println("Will start now...");
new StressTest(Integer.parseInt(args[0])).start(Integer.parseInt(args[1]));
}
}