package edu.usc.enl.dynamicmeasurement.process;
import edu.usc.enl.dynamicmeasurement.data.FinishPacket;
import edu.usc.enl.dynamicmeasurement.model.Packet;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
/**
* Created with IntelliJ IDEA.
* User: Masoud
* Date: 1/31/13
* Time: 7:03 PM <br/>
* Any class that wants to use a stream of packets can implement this.
* It can either be used as a thread that reads from a blocking queue or run separately
*/
public abstract class PacketUser extends Thread{
/**
* gather incoming packets
*/
private final BlockingQueue<Packet> queue;
public static final int Q_CAPACITY = 1000;
public PacketUser() {
this.queue = new ArrayBlockingQueue<>(Q_CAPACITY);
}
/**
* pass this queue to the a PacketLoader thread to fill it.
*
* @return
*/
public BlockingQueue<Packet> getQueue() {
return queue;
}
@Override
public final void run() {
try {
while (true) {
Packet p = queue.take();
if (p instanceof FinishPacket) {
finish((FinishPacket) p);
break;
}
process(p);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public abstract void process(Packet p);
public abstract void finish(FinishPacket p);
}