}
private static void start(int num_threads, int num_msgs, int segment_size) {
final AckReceiverWindow win=new AckReceiverWindow(1, segment_size);
final AtomicInteger counter=new AtomicInteger(num_msgs);
final AtomicLong seqno=new AtomicLong(1);
final AtomicInteger removed_msgs=new AtomicInteger(0);
final CountDownLatch latch=new CountDownLatch(1);
Adder[] adders=new Adder[num_threads];
for(int i=0; i < adders.length; i++) {
adders[i]=new Adder(win, latch, counter, seqno, removed_msgs);
adders[i].start();
}
long start=System.currentTimeMillis();
latch.countDown(); // starts all adders
for(Adder adder: adders) {
try {
adder.join();
}
catch(InterruptedException e) {
e.printStackTrace();
}
}
for(int i=0; i < 50; i++) {
if(removed_msgs.get() >= num_msgs)
break;
else {
System.out.println("removed: " + removed_msgs.get());
Util.sleep(100);
List<Message> msgs=win.removeManyAsList(segment_size);
if(msgs != null && !msgs.isEmpty())
removed_msgs.addAndGet(msgs.size());
}
}
long time=System.currentTimeMillis() - start;
double requests_sec=num_msgs / (time / 1000.0);
System.out.println("\nTime: " + time + " ms, " + Util.format(requests_sec) + " requests / sec\n");
System.out.println("Total removed messages: " + removed_msgs);
assert removed_msgs.get() == num_msgs :
"removed messages (" + removed_msgs.get() + ") != num_msgs (" + num_msgs + ")";
}