- 浏览: 106177 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
chenbaiyang12csdn:
你好,运行LDA之后,使用工具打印出来结果这一部分能否给予一个 ...
mahout中LDA简介以及示例 -
Open-Uheart:
有一个老项目,应用的是apache-solr-1.4.1 出现 ...
solr admin UI
所谓的”读者—写者问题”是指保证一个Writer进程必须与其他进程互斥地访问共享对象地同步问题.其读写操作限制(包括读者优先和写者优先): 1)写--写互斥,即不能有两个写者同时进行写操作; 2)读--写互斥,即不能同时有一个进程在读而另一个进程在写; 3)读--读允许,即允许同时有多个进程在读同一个对象或文件.
package myprojects.rwproblem;
import java.awt.*;
import java.io.*;
import java.lang.*;
import java.util.*;
public class Rwproblem
{
static final int MAX_THREAD_NUM=64;
public static void main(String args[])
{
char test='0';
do
{
System.out.println();
System.out.println("----------Demo of Reader and Writer Problem----------");
System.out.println(" 1:Reader Priority.");
System.out.println(" 2:Writer Priority.");
System.out.println(" 3:Exit to Windows.");
try
{
test=(char)System.in.read();
System.in.read();
}catch(IOException e){}
}while(test!='3'&&test!='1'&&test!='2');
if(test=='3')return;
Reader_Writer_Thread [] m_thread;
m_thread=new Reader_Writer_Thread[MAX_THREAD_NUM];
m_thread[0]=new Reader_Writer_Thread('r',1,3,5);
m_thread[1]=new Reader_Writer_Thread('w',2,4,5);
m_thread[2]=new Reader_Writer_Thread('r',3,5,2);
m_thread[3]=new Reader_Writer_Thread('r',4,6,5);
m_thread[4]=new Reader_Writer_Thread('w',5,5.1,3);
if(test=='2')
{
m_thread[0].setpriority(2);
System.out.println(" Demo of R_W Problem in Writer_Priority:");
}
else System.out.println(" Demo of R_W Problem in Reader_Priority:");
m_thread[0].start();
m_thread[1].start();
m_thread[2].start();
m_thread[3].start();
m_thread[4].start();
}
}
class CriticalOfReader//读者临界区
{
private int m_critical;
CriticalOfReader()
{
m_critical=0;
}
public synchronized void enterCriticalSection()//进入临界区
{
try
{
if(m_critical!=0)wait();
}catch (InterruptedException e) { }
m_critical=1;
}
public synchronized void leaveCriticalSection()//离开临界区
{
m_critical=0;
notify();
}
}
class CriticalOfWriter//写者临界区
{
private int m_critical;
CriticalOfWriter()
{
m_critical=0;
}
public synchronized void enterCriticalSection()//进入临界区
{
try
{
if(m_critical!=0)wait();
}catch (InterruptedException e) { }
m_critical=1;
}
public synchronized void leaveCriticalSection()//离开临界区
{
m_critical=0;
notify();
}
}
class Reader_Writer_Thread extends Thread
{
static final int PER_SEC_DELAY=1000;//每秒运行数
private static int m_ipriority;//优先级别(1代表读者优先,2代表写者优先)
private static CriticalOfWriter m_criticalOfWriter;//写者临界区
private static CriticalOfReader m_criticalOfReader;//读者临界区
private static int m_iNumOfWriter;//写者总数
private static int m_iNumOfReader;//读者总数
private char m_chEntity;//线程类别
private int m_iSerial;//序列号
private double m_dDelay;//延迟时间
private double m_dPersist;//读持续时间
static
{
m_ipriority=0;
m_iNumOfWriter=0;
m_iNumOfReader=0;
m_criticalOfWriter=new CriticalOfWriter();
m_criticalOfReader=new CriticalOfReader();
}
Reader_Writer_Thread(char entity,int serial,double delay,double persist)//构造函数
{
m_chEntity=entity;
m_iSerial=serial;
m_dDelay=delay;
m_dPersist=persist;
}
public boolean setpriority(int priority)//设置优先数
{
if(priority==1||priority==2){m_ipriority=priority;return true;}
return false;
}
public void run()//主运行
{
//区别写者与读者线程
if(m_chEntity=='r')reader_run();
else if(m_chEntity=='w')writer_run();
}
public void reader_run()//读者线程运行函数
{
try
{
Thread.sleep((long)m_dDelay*PER_SEC_DELAY);
}catch(InterruptedException e){}
Date temp=new Date();
System.out.print(Integer.toString(temp.getMinutes())+":"
+Integer.toString(temp.getSeconds())+" ");
System.out.println("Reader thread "+m_iSerial+" sends the reading require.");
incNumOfReader();
try
{
sleep((long)m_dPersist*PER_SEC_DELAY);
}catch(InterruptedException e){}
decNumOfReader();
}
public void writer_run()//写者线程线程运行函数
{
try
{
Thread.sleep((long)m_dDelay*PER_SEC_DELAY);
}catch(InterruptedException e){}
Date temp=new Date();
System.out.print(Integer.toString(temp.getMinutes())+":"
+Integer.toString(temp.getSeconds())+" ");
System.out.println("Writer thread "+m_iSerial+" sends the writing require.");
incNumOfWriter();
try
{
sleep((long)m_dPersist*PER_SEC_DELAY);
}catch(InterruptedException e){}
decNumOfWriter();
}
public synchronized void incNumOfReader()//互斥
{
//写者优先时,先进入读者临界区
if(m_ipriority==2)m_criticalOfReader.enterCriticalSection();
//如果是第一个读者,则等待写者写完
m_iNumOfReader++;
if(m_iNumOfReader==1)m_criticalOfWriter.enterCriticalSection();
if(m_ipriority==2)m_criticalOfReader.leaveCriticalSection();//让其他读者进
Date temp=new Date();
System.out.print(Integer.toString(temp.getMinutes())+":"
+Integer.toString(temp.getSeconds())+" ");
System.out.println("Reader thread "+m_iSerial+" begins to read the file!");
}
public synchronized void decNumOfReader()//互斥
{
m_iNumOfReader--;
Date temp=new Date();
System.out.print(Integer.toString(temp.getMinutes())+":"
+Integer.toString(temp.getSeconds())+" ");
System.out.println("Reader thread "+m_iSerial+" finished reading the file!");
if(m_iNumOfReader==0)m_criticalOfWriter.leaveCriticalSection();//唤醒写者
}
public synchronized void incNumOfWriter()//互斥
{
m_iNumOfWriter++;
//若是写者优先,第一个写者需等待读者写完
if(m_ipriority==2&&m_iNumOfWriter==1)m_criticalOfReader.enterCriticalSection();
m_criticalOfWriter.enterCriticalSection();//进入写者临界区
Date temp=new Date();
System.out.print(Integer.toString(temp.getMinutes())+":"
+Integer.toString(temp.getSeconds())+" ");
System.out.println("Writer thread "+m_iSerial+" begins to write to the file!");
}
public synchronized void decNumOfWriter()//互斥
{
m_iNumOfWriter--;
Date temp=new Date();
System.out.print(Integer.toString(temp.getMinutes())+":"
+Integer.toString(temp.getSeconds())+" ");
System.out.println("Reader thread "+m_iSerial+" finished writing to the file!");
m_criticalOfWriter.leaveCriticalSection();//唤醒等待者(读者写者都有可能)
if(m_iNumOfWriter==0&&m_ipriority==2)m_criticalOfReader.leaveCriticalSection();
//最后一个写者,唤醒读者
}
}
发表评论
-
Thread 状态详解
2014-01-09 12:04 516原文:http://www.cnblogs.com/Drea ... -
java 线程安全的实现方式
2012-12-31 18:48 1147线程安全的定义: <<Java Concurre ... -
java 内存模型与线程 正文
2012-12-31 15:39 935在前传中讲述了jvm中内存的划分, 是从线程的 ... -
java 内存模型与线程 前传
2012-12-31 14:37 792尽管各类框架 , ... -
jdk 线程池 threadPoolExecutor 源码剖析
2011-04-01 19:44 1941public void execute(Runnable co ... -
线程池vs多线程
2011-03-26 12:12 1116做过一个基于线程池的http服务器,面试时老师经 ... -
nio 高并发处理
2011-03-25 23:35 1215引子:今天在面试的时 ...
相关推荐
modbus的读写java实现
使用java8 scoket 实现西门子s7协议 可以读写 s7系列全部plc 没有dll 文件 纯原生java
关于读写锁算法的Java实现及思考关于读写锁算法的Java实现及思考关于读写锁算法的Java实现及思考关于读写锁算法的Java实现及思考关于读写锁算法的Java实现及思考关于读写锁算法的Java实现及思考关于读写锁算法的Java...
java中用FileUtil实现文件读写
java实现文件读写操作,小例子,供大家参考
使用Java实现对dbf文件的简单读写.
用java编程实现的读写者问题,用于模拟操作系统相关内容。
java实现modbus读写.pdf
* 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值足够大。 * 通常,Reader 所作的每个读取请求都会导致对底层...
读者写者问题是在生产者消费者问题的基础上改进而来,其不同点仅在于加入一个计数变量count来记录处于读写空间中读者的数量,实现读者可同时读文件。 银行家算法基于安全性算法实现,其目的是避免死锁方法中允许...
压缩包中包含java读写hdf5格式文件时需要的jar包和动态链接库,动态链接库提供了windows、linux两种版本的
本人编写的用java 实现对word文档的新建,打开,写入保存。需要包含poi外包实现。
操作系统课程设计采用读写平等实现的读者写者问题。
最近在研究处理java写modbus RTU通信,分别使用几套工具,模拟modbus从站、模拟串口等才能正常在电脑测试成功。 全开源,放心下载 可以查看运行内容https://blog.csdn.net/weijia3624/article/details/121216539
Java实现对文件的读写,可设置编码格式
用java写的小程序,实现1GB以上文件的读写
office excel xlsx文件的读写的简约实现, 能读取,生成xlsx文件, 代码只是实现了基础的读写, 如果需要更多的功能, 请自行在源代码基础上进行开发
可运行的java项目,分别用两种方案实现modbus协议读写1、jlibmodbus 2、modbus4j 有问题可联系QQ:361440206
Java实现对文件的读写,可设置编码格式
主要介绍了Java 读写锁实现原理浅析,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下