复制代码代码如下:
paquete com.ysh.file;
import java.util.arrayList;
import java.util.linkedlist;
import java.util.list;
import java.util.concurrent.locks.condition;
import java.util.concurrent.locks.lock;
import java.util.concurrent.locks.reentrantlock;
import com.google.common.collect.lists;
clase pública Writequeue {
Private estático final int max_queue_size = 10000;
Private LinkedList <String> queueCache = lists.newlinkedList ();
bloqueo de bloqueo privado = nuevo reentrantlock ();
condición privada full = lock.newcondition ();
condición privada vacía = Lock.NewCondition ();
Writeueue privado () {
}
Holder de escritura de clase estática privada {
Instancia de escritura estática final privada = new Writequeue ();
}
public static writeue getInstance () {
devolver WriteueHolder.Instance;
}
public void add (línea de cadena) {
Lock.lock ();
intentar {
while (queueCache.size ()> = max_queue_size) {
full.await ();
}
queueCache.addfirst (línea);
vacía.signal ();
} capt (interruptedException e) {
E.PrintStackTrace ();
} finalmente {
Lock.unlock ();
}
}
public void add (list <string> linelist) {
Lock.lock ();
intentar {
while (queueCache.size ()> = max_queue_size) {
full.await ();
}
QueueCache.addall (Linelist);
vacía.signal ();
} capt (interruptedException e) {
E.PrintStackTrace ();
} finalmente {
Lock.unlock ();
}
}
Public ArrayList <String> FLUSH () {
ArrayList <String> temp = null;
Lock.lock ();
intentar {
while (queueeCache.size () == 0) {
vacía.await ();
}
temp = lists.newarrayList ();
temp.addall (QueueCache);
QueueCache.Clear ();
full.signal ();
} capt (interruptedException e) {
E.PrintStackTrace ();
} finalmente {
Lock.unlock ();
}
regresar temp;
}
}