复制代码代码如下:
pacote com.ysh.file;
importar java.util.arraylist;
importar java.util.LinkedList;
importar java.util.list;
importar java.util.concurrent.locks.condition;
importar java.util.concurrent.locks.lock;
importar java.util.concurrent.locks.reentrantlock;
importar com.google.common.collect.lists;
classe pública writeQueue {
private estático final int max_queue_size = 10000;
Private LinkedList <String> Queuecache = lists.NewLinkedList ();
bloqueio privado de bloqueio = new reentrantlock ();
condição privada Full = Lock.NewCondition ();
condição privada vazia = bloqueio.newcondition ();
Private WriteQueue () {
}
Classe estática privada WriteQueueHolder {
Instância de Writeeue estática final privada = new writeQueue ();
}
public static writeQueue getInstance () {
retornar writeQueueholder.instance;
}
public void add (linha de string) {
Lock.lock ();
tentar {
while (Queuecache.size ()> = max_queue_size) {
Full.await ();
}
Queuecache.addfirst (linha);
vazio.signal ();
} catch (interruptedException e) {
E.PrintStackTrace ();
} finalmente {
Lock.Unlock ();
}
}
public void add (list <string> lineList) {
Lock.lock ();
tentar {
while (Queuecache.size ()> = max_queue_size) {
Full.await ();
}
Queuecache.addall (linelist);
vazio.signal ();
} catch (interruptedException e) {
E.PrintStackTrace ();
} finalmente {
Lock.Unlock ();
}
}
public ArrayList <String> flush () {
ArrayList <String> temp = null;
Lock.lock ();
tentar {
while (Queuecache.size () == 0) {
vazio.await ();
}
temp = lists.newArrayList ();
temp.addall (Queuecache);
Queuecache.clear ();
Full.signal ();
} catch (interruptedException e) {
E.PrintStackTrace ();
} finalmente {
Lock.Unlock ();
}
retornar temp;
}
}