课程设计——利用信号量实现读-写者问题(JAVA)
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)的更多相关文章
- 课程设计——利用信号量实现哲学家进餐问题(JAVA)
package cn.Douzi.PhiEat; /** * 表示筷子的类 */ public class Chopstick{ /** * 表示筷子是否可用 */ private volatile ...
- 课程设计——利用信号量实现生产者-消费者问题(java)
package cn.Douzi.ProductConsume; import java.util.LinkedList; import java.util.Queue; import java.ut ...
- 在linux下利用信号量实现一个写者线程多个读者线程
#include<pthread.h> #include<string.h> #include<stdlib.h> #include<stdio.h> ...
- JAVA课程设计+五子棋(团队博客)
JAVA课程设计 利用所学习的JAVA知识设计一个五子棋小游戏 1.团队名称.团队成员介绍(菜鸟三人组) 杨泽斌[组长]:201521123049 网络1512 叶文柠[组员]:20152112305 ...
- JAVA课程设计——一个简单的教务人事管理系统
大三上学期期末总结,没错,上学期,写在下学期新学期开始,哈哈哈. 上学期学习了面向对象程序设计,课程设计的题目使用JAVA语言完成一个简单的教务人事管理系统,能够实现访问数据库的登录验证,分别按部门和 ...
- java课程设计(计算器)
JAVA课程 设 计 报 告 1206401-18 瞿杰 一.设计时间 2013年6月 24日-----6月28日 二.设计地点 湖南城市学院实验楼计算机506机房 三.设计目的 1.巩固学习VB ...
- Java课程设计---索引
一.基础配置 ============================================================== 1.Java课程设计---Eclipse基本环境配置 2.J ...
- 代写编程的作业、笔试题、课程设计,包括但不限于C/C++/Python
代写编程作业/笔试题/课程设计,包括但不限于C/C++/Python 先写代码再给钱,不要任何定金!价钱公道,具体见图,诚信第一! (截止2016-11-22已接12单,顺利完成!后文有成功交付的聊天 ...
- Bryce1010的操作系统课程设计
https://download.csdn.net/download/fire_to_cheat_/10221003 上面是课程设计的代码,下载需要一些积分. 1.作业调度 2.磁盘调度 常见的磁盘调 ...
随机推荐
- Floyd模板(详细操作最基础版)
#include<cstdio> #include<iostream> using namespace std; #define MAX 500 #define INFE 1& ...
- 软件图书,偏.net方向
深入理解计算机系统(原书第2版) 作者:Randal E.Bryant:1981年在麻省理工学院获计算机科学博士学位,现任美国卡内基·梅隆大学计算机学院院长 内容: 深入浅出地介绍了处理器.编译器.操 ...
- 在pycharm中使用scrapy爬虫
目标在Win7上建立一个Scrapy爬虫项目,以及对其进行基本操作.运行环境:电脑上已经安装了python(环境变量path已经设置好), 以及scrapy模块,IDE为Pycharm .操作如下: ...
- c语言基础笔记
一 :数据类型 1.float类型,在输出的时候可以使用 .数字 来把浮点数精确到小数点后几位,比如 printf("%.3f",float)精确到小数点后三位,不足补0 2.字 ...
- 外部JS的阻塞下载
转载于:http://www.cnblogs.com/mofish/archive/2011/09/29/2195256.html 所有浏览器在下载JS的时候,会阻止一切其他活动,比如其他资源的下载, ...
- app耗电量测试工具--PowerTutor
PowerTutor是一款用来测试手机功耗的小工具,它可以只管地展示手机系统主要的组件和各种用户app产生的功耗数据.它可以统计app的屏幕功耗(LCD).CPU功耗以及WiFi和3G网络功耗,我们可 ...
- 小程序 setData() 方法
setData() 参数格式 字段 类型 必填 描述 最低版本 data Object 是 这次要改变的数据 callback Function 否 回调函数 1.5.0 callback 是一个 ...
- HDU 4767——Bell
昨天比赛被虐的这个题目. 今天听斌牛讲过他的思路后就A掉了. 题目的意思是要你求出bell数的第n项对95041567取模. 首先,95041567=31*37*41*43*47: 然后取模就是先分别 ...
- bzoj2386 [CEOI2011] Team
题意 给你n个数,每个数的大小在1到n之间,要求把它们分成几组,每个数字的大小要小于等于它所在组中的数字总个数,问最多能分出多少组. 分析 首先把所有数字排序,比较显然的是最后一定存在一个最优解是按这 ...
- document.readyState的使用
document.readyState:判断文档是否加载完成.firefox不支持. 这个属性是只读的,传回值有以下的可能: 0-UNINITIALIZED:XML 对象被产生,但没有任何文件被加载. ...