java多线程读写文件示例

时间:2021-05-19

复制代码 代码如下:
package 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;

public class WriteQueue {
private static final int MAX_QUEUE_SIZE = 10000;
private LinkedList<String> queueCache = Lists.newLinkedList();
private Lock lock = new ReentrantLock();
private Condition full = lock.newCondition();
private Condition empty = lock.newCondition();

private WriteQueue() {
}

private static class WriteQueueHolder {
private final static WriteQueue INSTANCE = new WriteQueue();
}

public static WriteQueue getInstance() {
return WriteQueueHolder.INSTANCE;
}

public void add(String line) {
lock.lock();
try {
while (queueCache.size() >= MAX_QUEUE_SIZE) {
full.await();
}
queueCache.addFirst(line);
empty.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}

public void add(List<String> lineList) {
lock.lock();
try {
while (queueCache.size() >= MAX_QUEUE_SIZE) {
full.await();
}
queueCache.addAll(lineList);
empty.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}

public ArrayList<String> flush() {
ArrayList<String> temp = null;
lock.lock();
try {
while (queueCache.size() == 0) {
empty.await();
}
temp = Lists.newArrayList();
temp.addAll(queueCache);
queueCache.clear();
full.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
return temp;
}

}

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章