package jp.crwdev.app.util;
import java.util.LinkedList;
import java.util.concurrent.CountDownLatch;
public class QueueingThread extends Thread {
public interface IQueueProcess {
void doProcess();
}
/**
* Constructor
*/
public QueueingThread(){
}
private LinkedList<IQueueProcess> mQueue = new LinkedList<IQueueProcess>();
private boolean mIsFinish = false;
private CountDownLatch mLatch = new CountDownLatch(1);
public void run(){
IQueueProcess process = null;
while(!mIsFinish){
try {
mLatch.await();
mLatch = new CountDownLatch(1);
} catch (InterruptedException e) {
}
synchronized(mQueue){
if(mQueue.size() == 0){
continue;
}
process = mQueue.pollLast();
//process = mQueue.pop();
mQueue.clear();
}
if(process != null){
process.doProcess();
process = null;
}
}
}
public void add(IQueueProcess process, boolean clearQueue){
synchronized(mQueue){
if(clearQueue){
mQueue.clear();
}
mQueue.push(process);
}
mLatch.countDown();
}
@Override
public void start(){
mIsFinish = false;
super.start();
}
public void release(){
mIsFinish = false;
synchronized(mQueue){
mQueue.clear();
}
mLatch.countDown();
super.interrupt();
}
}