package edu.cmu.graphchi.walks;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
public abstract class DumperThread implements Runnable {
private final LinkedBlockingQueue<BucketsToSend> bucketQueue;
private final AtomicLong pendingWalksToSubmit;
private final AtomicBoolean finished;
public DumperThread(LinkedBlockingQueue<BucketsToSend> bucketQueue,
AtomicLong pendingWalksToSubmit,
AtomicBoolean finished) {
this.bucketQueue = bucketQueue;
this.pendingWalksToSubmit = pendingWalksToSubmit;
this.finished = finished;
}
public void run() {
while(!finished.get() || bucketQueue.size() > 0) {
BucketsToSend bucket = null;
try {
bucket = bucketQueue.poll(1000, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
}
if (bucket != null) {
pendingWalksToSubmit.addAndGet(-bucket.length);
for(int i=0; i<bucket.length; i++) {
processWalks(bucket, i);
}
}
}
sendRest();
}
protected abstract void processWalks(BucketsToSend bucket, int i);
protected abstract void sendRest();
}