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

课程设计——利用信号量实现读-写者问题(JAVA)的更多相关文章

  1. 课程设计——利用信号量实现哲学家进餐问题(JAVA)

    package cn.Douzi.PhiEat; /** * 表示筷子的类 */ public class Chopstick{ /** * 表示筷子是否可用 */ private volatile ...

  2. 课程设计——利用信号量实现生产者-消费者问题(java)

    package cn.Douzi.ProductConsume; import java.util.LinkedList; import java.util.Queue; import java.ut ...

  3. 在linux下利用信号量实现一个写者线程多个读者线程

    #include<pthread.h> #include<string.h> #include<stdlib.h> #include<stdio.h> ...

  4. JAVA课程设计+五子棋(团队博客)

    JAVA课程设计 利用所学习的JAVA知识设计一个五子棋小游戏 1.团队名称.团队成员介绍(菜鸟三人组) 杨泽斌[组长]:201521123049 网络1512 叶文柠[组员]:20152112305 ...

  5. JAVA课程设计——一个简单的教务人事管理系统

    大三上学期期末总结,没错,上学期,写在下学期新学期开始,哈哈哈. 上学期学习了面向对象程序设计,课程设计的题目使用JAVA语言完成一个简单的教务人事管理系统,能够实现访问数据库的登录验证,分别按部门和 ...

  6. java课程设计(计算器)

    JAVA课程 设 计 报 告 1206401-18   瞿杰 一.设计时间 2013年6月 24日-----6月28日 二.设计地点 湖南城市学院实验楼计算机506机房 三.设计目的 1.巩固学习VB ...

  7. Java课程设计---索引

    一.基础配置 ============================================================== 1.Java课程设计---Eclipse基本环境配置 2.J ...

  8. 代写编程的作业、笔试题、课程设计,包括但不限于C/C++/Python

    代写编程作业/笔试题/课程设计,包括但不限于C/C++/Python 先写代码再给钱,不要任何定金!价钱公道,具体见图,诚信第一! (截止2016-11-22已接12单,顺利完成!后文有成功交付的聊天 ...

  9. Bryce1010的操作系统课程设计

    https://download.csdn.net/download/fire_to_cheat_/10221003 上面是课程设计的代码,下载需要一些积分. 1.作业调度 2.磁盘调度 常见的磁盘调 ...

随机推荐

  1. Java中的Object类的toString()方法,equals()方法

    Object类是所有类的父类,若没有明确使用extends关键字明确表示该类继承哪个类,那么它就默认继承Object类,也就可以使用Object中的方法: 1.toString 如果输出一个对象的时候 ...

  2. OGNL动态实现result

    OGNL就是struts.xml文件中的<result>通过get()方法,动态获取action类中的变量 <struts> <package name="de ...

  3. c# 修改pdf

    继续引用spire的dll. 1.代码如下: PdfDocument doc = new PdfDocument(); doc.LoadFromFile("wen.pdf"); P ...

  4. web项目页面加载时,下拉框有值

    1.我用的框架是springmvc和mybaitis 由于没有整个项目,直接就去请求的action  :http://localhost:8080/ytert/test/selectStoreType ...

  5. 【数位dp】Enigma

    http://codeforces.com/gym/101889 E 与一般数位dp不同,保存的是能否满足条件,而非记录方案数 代码: #include <iostream> #inclu ...

  6. Maven实现项目构建直接部署Web项目到Tomcat

    Maven实现项目构建直接部署Web项目到Tomcat配置如下: 1.Tomcat的用户及权限配置:在conf目录下,找到tomcat-users.xml,添加manager权限的用户. <ro ...

  7. (打补丁 )patch

    前言: diff:逐行比较文件的不同,并且显示出来. patch: 打补丁工具,将补丁打到老文件里面,也就是diff左边的那个文件,使得老文件和新文件一样 格式:diff [选项] 老文件 新文件 格 ...

  8. Centos7更改默认启动桌面(或命令行)模式

    centos7以后是这样的,7以前就是别的版本了 1.systemctl get-default命令获取当前模式 2.systemctl set-default graphical.target 修改 ...

  9. jquery validate 一个注册表单的应用

    先看页面 前端表单代码  register.html <form class="mui-input-group" id="regForm"> < ...

  10. nodejs 调试

    什么语言入门的准备功能就是写helloworld, 调试. 用惯了chrome的话,推荐用chrome自带的调试器来调试.很方便. 在地址栏中输入 chrome://inspect 并按回车,会打开如 ...