复制代码代码如下:
package com.ysh.file;
import java.util.arraylist;
import java.util.linkedlist;
Importer java.util.list;
import java.util.concurrent.locks.condition;
import java.util.concurrent.locks.lock;
Importer java.util.concurrent.locks.rentrantlock;
import com.google.common.collect.lists;
classe publique writequeue {
Final statique privé int max_queue_size = 10000;
LinkedList privé <string> queueCache = listS.NewLinkEdList ();
Lock de verrouillage privé = new reentrantLock ();
état privé complet = lock.newCondition ();
condition privée vide = lock.newCondition ();
écriture privée () {
}
classe statique privée writequeueHolder {
instance privée final writequeue statique = new WriteQueue ();
}
public static writequeue getInstance () {
return writeQueueHolder.instance;
}
public void add (ligne de chaîne) {
lock.lock ();
essayer {
while (queueCache.size ()> = max_queue_size) {
Full.Await ();
}
queueCache.addFirst (ligne);
vide.signal ();
} catch (InterruptedException e) {
e.printStackTrace ();
} enfin {
lock.unlock ();
}
}
public void add (list <string> linelist) {
lock.lock ();
essayer {
while (queueCache.size ()> = max_queue_size) {
Full.Await ();
}
queueCache.addall (linelist);
vide.signal ();
} catch (InterruptedException e) {
e.printStackTrace ();
} enfin {
lock.unlock ();
}
}
public ArrayList <string> flush () {
ArrayList <string> temp = null;
lock.lock ();
essayer {
while (queueCache.size () == 0) {
vide.Await ();
}
temp = lists.newArrayList ();
temp.Addall (queueCache);
queueCache.clear ();
full.signal ();
} catch (InterruptedException e) {
e.printStackTrace ();
} enfin {
lock.unlock ();
}
Tempère de retour;
}
}