⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readwrite.java

📁 Java写的“读者写者问题”示例
💻 JAVA
字号:
//本程序中往管道字节输出流中写入的字节是随机产生的,什么时候写入结束也是由程序随机决定

import java.io.*;
public class ReadWrite					//主程序类
{
	public static void main(String args[]) throws IOException
	{
		Pipe p = new Pipe();					//先建一个管道
		reader r = new reader(p);				//分别建立读者和写者,并连到管道
		writer w = new writer(p);
		r.start();								//开启线程
		w.start();
	}
}

class Pipe								//管道类
{
	boolean readOver = false;			//记录管道字节输入流是否结束,结束的话将其置为true
	boolean writeOver = false;			//记录管道字节输出流是否结束,结束的话将其置为true
	private PipedOutputStream pw;		//管道字节输出流
	private PipedInputStream pr;		//管道字节输入流
	private int num = 0; 				//用来记录当前管道字节流中有多少可读的字节
	public Pipe() throws IOException
	{
		pw = new PipedOutputStream();
		pr = new PipedInputStream(pw);	//初始化,将管道字节输入流连接到管道字节输出流
	}
	
	public synchronized void writePipe() throws IOException	//往管道字节输出流里写数据
	{
		if(Math.random()>0.25)			//随机决定管道字节输入流是否结束
		{
			int c = (int)(Math.random()*100);
			pw.write(c);				//往管道字节输入流随机写入一个字节(只有一字节被写入)
			System.out.println("writer write:\t"+(char)c);
		}
		else
		{
			pw.write('.');
			writeOver = true;			//输出流结束
			System.out.println("writer write:\t"+".");
			System.out.println("Write Over!");
		}
		num++;							//管道字节流中可读的字节增加一
		notify();						//唤醒读进程
	}
	
	public synchronized void readPipe() throws IOException	//从管道字节输入流里读数据
	{
		if(num==0) //无字节可读
		{
			try
			{
				System.out.println("reader waiting...");
				wait();					//无可读字节,等待
			}
			catch(InterruptedException e){};
		}
		int c;
		if((c=pr.read())!='.')
			System.out.println("reader read:\t"+(char)c);	//管道字节输入流没有结束,输出读入的字节
		else
		{
			readOver = true;
			System.out.println("reader read:\t"+(char)c);		//管道字节输入流结束,输出结束符'.'
			System.out.println("Read Over!");
		}
		num--;							//管道字节流中可读的字节减少一
	}
}
	
class reader implements Runnable				//读者类
{
	private Pipe p;						//与读者相关的管道
	Thread readerIns;
	public void start()
	{
		if(readerIns==null)
		{
			readerIns=new Thread(this,"Reader");
			readerIns.start();
		}
	}
	public reader(Pipe p)
	{
		this.p = p;
	}
	
	public void run()
	{
		try
		{
			while(p.readOver==false)	//读入字节直到管道字节输入流结束
				p.readPipe();
		}
		catch(IOException e){}
	}
}

class writer implements Runnable			//写者类
{
	private Pipe p;						//与写者相关的管道
	Thread writeIns;
	public void start()
	{
		if(writeIns==null)
		{
			writeIns=new Thread(this,"Writer");
			writeIns.start();
		}
	}
	public writer(Pipe p)
	{
		this.p = p;
	}
	
	public void run()
	{
		try
		{
			while(p.writeOver==false)	//写入字节直到管道字节输出流结束
				p.writePipe();
		}
		catch(IOException e){}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -