複製代碼代碼如下:
包com.ysh.file;
導入java.util.arraylist;
導入java.util.linkedlist;
導入java.util.list;
導入java.util.concurrent.locks.condition;
導入java.util.concurrent.locks.lock;
導入java.util.concurrent.locks.reentrantlock;
導入com.google.common.collect.lists;
公共類寫入{
私有靜態最終int max_queue_size = 10000;
private linkedlist <string> queuecache = lists.newlinkedlist();
私有鎖定= new Reentrantlock();
私有條件full = lock.newcondition();
私有條件為空= lock.newcondition();
私有寫(){
}
私人靜態類Writequeuholder {
私有最終靜態寫入實例= new writequeue();
}
public static writequeue getinstance(){
返回writequeueholder.intance;
}
public void add(字符串線){
lock.lock();
嘗試 {
while(queuecache.size()> = max_queue_size){
full.await();
}
queuecache.addfirst(line);
kument.signal();
} catch(InterruptedException e){
e.printstacktrace();
} 最後 {
lock.unlock();
}
}
public void add(list <string> linelist){
lock.lock();
嘗試 {
while(queuecache.size()> = max_queue_size){
full.await();
}
queuecache.addall(Linelist);
kument.signal();
} catch(InterruptedException e){
e.printstacktrace();
} 最後 {
lock.unlock();
}
}
public arraylist <string> flush(){
arraylist <string> temp = null;
lock.lock();
嘗試 {
while(queuecache.size()== 0){
empty.await();
}
temp = lists.newarraylist();
temp.addall(queuecache);
queuecache.clear();
full.signal();
} catch(InterruptedException e){
e.printstacktrace();
} 最後 {
lock.unlock();
}
返回溫度;
}
}