java多线程读写文件示例

时间:2021-08-11 11:03:28 


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;
 }

}

标签:java,多线程,文件
0
投稿

猜你喜欢

  • 聊聊Controller中RequestMapping的作用

    2021-12-08 20:48:45
  • Android实现View滑动效果的6种方法

    2023-01-29 15:12:19
  • 教你怎么用Idea打包jar包

    2023-03-15 03:30:51
  • C# Dockpanel入门基础必看篇

    2023-02-24 18:50:42
  • android xml实现按钮的圆角、阴影效果及按下变化效果的实现代码

    2022-07-30 23:23:12
  • Java编程用栈来求解汉诺塔问题的代码实例(非递归)

    2023-01-13 21:41:25
  • SpringBoot如何用java生成静态html

    2023-08-08 08:46:59
  • Android Studio实现智能聊天

    2021-10-03 09:56:18
  • Java maven三种仓库,本地仓库,私服,中央仓库的配置

    2023-04-13 12:05:17
  • vista和win7在windows服务中交互桌面权限问题解决方法:穿透Session 0 隔离

    2021-06-16 04:05:47
  • Android 实现自己的LOG信息

    2023-06-08 16:30:30
  • JavaSE中compare、compareTo的区别

    2021-12-28 09:37:47
  • Android12四大组件之Activity生命周期变化详解

    2022-05-04 15:47:57
  • java编程中字节流转换成字符流的实现方法

    2021-06-09 15:59:04
  • C#三种方法获取文件的Content-Type(MIME Type)

    2022-05-28 16:57:27
  • 详解JS与APP原生控件交互

    2022-11-21 21:28:15
  • Android UI动态设置带有Stroke渐变色背景Drawable

    2023-12-02 15:44:56
  • 10种简单的Java性能优化

    2023-06-20 20:43:41
  • C#操作目录与文件的方法步骤

    2023-11-23 20:45:52
  • Java使用Jdbc连接Oracle执行简单查询操作示例

    2021-07-25 03:34:25
  • asp之家 软件编程 m.aspxhome.com