- 浏览: 111404 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 558原文:http://www.cnblogs.com/Drea ... -
java 线程安全的实现方式
2012-12-31 18:48 1196线程安全的定义: <<Java Concurre ... -
java 内存模型与线程 正文
2012-12-31 15:39 1020在前传中讲述了jvm中内存的划分, 是从线程的 ... -
java 内存模型与线程 前传
2012-12-31 14:37 856尽管各类框架 , ... -
jdk 线程池 threadPoolExecutor 源码剖析
2011-04-01 19:44 1979public void execute(Runnable co ... -
线程池vs多线程
2011-03-26 12:12 1163做过一个基于线程池的http服务器,面试时老师经 ... -
nio 高并发处理
2011-03-25 23:35 1264引子:今天在面试的时 ...
相关推荐
在这个场景中,"读写者问题"的Java实现展示了如何在多线程环境下通过读写锁有效地控制对共享资源的访问,保证数据的一致性和正确性。通过这种方式,我们可以在操作系统层面模拟并发控制,理解读写者问题的解决方案,...
5. **代码实现**:在提供的文件"read_write"中,可能包含了用特定编程语言(如C、C++、Java等)实现的读写者问题解决方案。代码通常会包含读者和写者的类或结构体,以及使用信号量或其他同步原语的逻辑。 解决读写...
### Modbus的读写Java实现 #### 一、概述 Modbus是一种广泛应用于电子控制器之间进行数据交换的通信协议标准,常用于工业自动化系统中。它支持多种物理层传输模式,如RS-232、RS-485以及TCP/IP网络等。本文将详细...
本教程将聚焦于如何使用原生Java 8来实现对西门子S7系列PLC的读写操作,而无需依赖任何DLL(动态链接库)文件,确保了程序的平台独立性和纯粹性。 首先,我们要理解S7协议。西门子的S7协议是用于其PLC产品通信的一...
Java实现Modbus读写 Java实现Modbus读写是指使用Java语言实现对Modbus协议的读写操作。Modbus是一种常用的工业通信协议,广泛应用于工业自动化、过程控制和监控系统中。 Java作为一种功能强大且广泛应用的编程语言...
下面我们将详细探讨Java读写锁的概念、实现原理以及如何在实际代码中应用。 1. **读写锁概念**: - 读写锁分为读锁(共享锁)和写锁(独占锁)。读锁允许多个线程同时读取数据,而写锁只允许一个线程进行写操作。 ...
使用 Java 实现对 dbf 文件的简单读写 Java 是一种广泛使用的编程语言,对于读写 dbf 文件具有重要的应用价值。本文将介绍使用 Java 实现对 dbf 文件的简单读写,包括读写 dbf 文件的基本步骤、相关类的介绍、代码...
读者写者问题是在生产者消费者问题的基础上改进而来,其不同点仅在于加入一个计数变量count来记录处于读写空间中读者的数量,实现读者可同时读文件。 银行家算法基于安全性算法实现,其目的是避免死锁方法中允许...
标题提及的“java读写hdf5格式文件需要使用的库”主要包括两个部分:Java接口库和操作系统特定的动态链接库。这里提供的jar文件`hdf5-3.3.2.jar`是Java接口库,它封装了对HDF5文件的操作,使得Java程序员可以通过...
在实际项目中,Java并发库提供了`java.util.concurrent.locks.ReentrantReadWriteLock`类,它是一个可重入的读写锁,可以更高效地处理读写冲突,但这里我们选择了一个更基础的实现,以便更好地理解读者写者问题的...
本篇将详细介绍如何在Java中实现文件的读写操作,并通过一个小例子帮助大家理解和实践。 一、Java中的文件操作基础 在Java中,`java.io`包提供了丰富的类和接口来支持文件操作,如`File`、`FileReader`、`...
关于读写锁算法的Java实现及思考,是一个深入探讨了多线程环境下资源访问控制机制的主题。在现代软件开发中,尤其是并发编程领域,读写锁(ReadWriteLock)是一种非常重要的同步工具,它允许多个线程同时进行读操作...
"Java 读写锁实现原理浅析" Java 读写锁实现原理浅析是 Java 并发编程中一个非常重要的主题。在多线程编程中,读写锁是解决读写并发问题的常用机制。本文主要介绍了 Java 读写锁实现原理浅析,包括读写锁的定义、...
通过本指南,你可以了解RFID读写的基本原理,以及如何使用Java实现RFID系统的功能。 1.1. 概述 RFID系统通常由RFID标签、阅读器(读写器)和后台管理系统三部分组成。Java以其跨平台性和丰富的库支持,成为开发RFID...
最近在研究处理java写modbus RTU通信,分别使用几套工具,模拟modbus从站、模拟串口等才能正常在电脑测试成功。 全开源,放心下载 可以查看运行内容https://blog.csdn.net/weijia3624/article/details/121216539
本人编写的用java 实现对word文档的新建,打开,写入保存。需要包含poi外包实现。
通过上述四个主要部分的分析,我们可以看到Java语言在处理文件读写方面提供了丰富的API支持。使用合适的类库可以极大地简化开发工作并提高程序的性能。例如,使用`StringBuffer`可以有效地处理字符串的动态增长;而`...
根据给定的文件信息,我们将深入探讨Java读写文件文本文件的关键知识点,这些知识点主要集中在文件的读取、写入以及流的复制等操作上。 ### Java读取文本文件 在Java中,读取文本文件通常涉及到使用`InputStream`...