package cn.Douzi.ReadWriter;

import java.util.Scanner;

public class ReadWrite {

    static public int count = 0;                //读者数量
static public int wcnt = 0; //写者数量
static public int REATIME = 1500; //读者休眠时间
static public int WRITIME = 1000; //写者休眠时间
static public boolean wFlag = false; //写信号 - 用于实现写优先
static public boolean rFlag = false; //读信号
static public Mutex mutex = new Mutex(1); //用于保护更新count变量时的互斥
static public Mutex rw = new Mutex(1); //用于保证读者和写者互斥的访问文件
static public StringBuilder file = new StringBuilder("空"); public static void main(String[] args) { System.out.println("|-----------------------------------------------------------|");
System.out.println("| |");
System.out.println("| Welcome to My System ! |");
System.out.println("| ↖ By Douzi 2017 ↗ |");
System.out.println("| 读写程序开始进行 |");
System.out.println("| |");
System.out.println("|-----------------------------------------------------------|"); Scanner scaner = new Scanner(System.in); System.out.println("设置读进程休眠时间: ");
REATIME = scaner.nextInt();
System.out.println("设置写进程休眠时间: ");
WRITIME = scaner.nextInt(); Writer w = new Writer();
Reader r = new Reader(); Thread t1 = new Thread(w);
Thread t2 = new Thread(r);
t1.start(); t2.start();
} } class Writer implements Runnable { @Override
public void run() {
// TODO Auto-generated method stub
while (true) {
try {
Thread.sleep(ReadWrite.WRITIME);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} if (!ReadWrite.wFlag && !ReadWrite.rFlag) { //在无写进程请求时进入
synchronized (ReadWrite.rw) { //互斥访问共享文件
System.out.println("写文件..........."); //写入
System.out.println("文件:" + ReadWrite.wcnt + "\n");
ReadWrite.file.append("文件:" + ReadWrite.wcnt++ + " - ");
if (ReadWrite.wcnt % 5 == 0) {
ReadWrite.file.append("\n");
}
}
} else {
break;
}
}
} } class Reader implements Runnable { @Override
public void run() {
// TODO Auto-generated method stub
while (true) {
try {
Thread.sleep(ReadWrite.REATIME);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (!ReadWrite.wFlag) { //在无写进程请求时进入
synchronized (ReadWrite.mutex) { //互斥访问count变量
if (ReadWrite.count == 0) { //当第一个读进程读共享文件时
ReadWrite.rFlag = true;
}
ReadWrite.count++; //读者计数器
System.out.println("读者数:" + ReadWrite.count );
}
} else {
System.out.println("已有写进程,暂不读文件............\n");
break;
}
System.out.println("读文件: " + ReadWrite.file + "\n");
synchronized (ReadWrite.mutex) { //互斥访问count变量
ReadWrite.count--; //读者计数器减1, 只有读者=0时候,才能继续写
if (ReadWrite.count == 0) { //当最后一个读进程读完共享文件
ReadWrite.rFlag = false;
}
}
}
}
} class Data {
private int data; public Data(int data) {
super();
this.data = data;
} public int getData() {
return data;
}
} class Mutex {
private int mutex; public Mutex(int mutex) {
super();
this.mutex = mutex;
} } class Buffer {
private int full;
private int empty;
public Buffer(int full, int empty) {
super();
this.full = full;
this.empty = empty;
}
}

最新文章

  1. Terminology: Sandbox
  2. Ubuntu Sublime Text 设置等宽字体
  3. 代码生成工具——CodeSmith
  4. javascript 字符串加密的几种方法
  5. Spark 1.1.0 编译(为了支持hbase 0.98.6)
  6. sql 字符次数
  7. surfaceview介绍
  8. web相关问题总结 - imsoft.cnblogs
  9. js部分---流程语句的基本形式;
  10. 高性能图文混排框架,构架顺滑的iOS应用-b
  11. 当一个控件属性不存在的时候,IDE会出错在这里
  12. FPGA中浮点运算实现方法——定标
  13. 14.10.2 File Space Management 文件空间管理:
  14. 这就涉及到ABAQUS历史输出中各能量变量的意义
  15. Java List 遍历
  16. Eclipse使当前项目依赖另一个项目
  17. PyCharm2018 安装
  18. 自定义Exception:MVC抛出自定义异常,并以Json方式返回
  19. 搭建本地离线yum仓库
  20. Android利用反射机制为实体类属性赋值

热门文章

  1. 团队项目成员与题目(本地地铁查询app)
  2. 【转】utf-8与Unicode的转化
  3. HDU 5672 String
  4. 我是IT小小鸟读书笔记
  5. bond下改变网卡
  6. oracle impdp导入时 提示“ORA-39002: 操作无效 ORA-39070: 无法打开日志文件 ”
  7. WebUploader 设置单个文件上传
  8. this.AcceptButton = button1的用法:
  9. 理解promise 01
  10. Spring事务管理Transaction【转】