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