用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - java代码库

缓冲池的模拟使用——操作系统课程实验

2012-09-03 作者: 神马举报

[java]代码库

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * 操作系统课程实验——缓冲池的模拟使用
 */
public class Test {
	// 1.创建空缓冲队列
	public List<Buffer_in> emq;
	// 2.创建输入数据缓冲队列
	public List<Buffer_in> inq;
	// 3.创建输出数据缓冲队列
	public List<Buffer_in> outq;
	// 4.创建30个缓冲单元
	public Buffer_in[] buffer;

	// 1.从type类型缓冲队列头取出一个缓冲区
	public Buffer_in takeBuf(List<Buffer_in> type) {
		Buffer_in temp = (Buffer_in) type.remove(0);
		return temp;
	}

	// 2.包含了同步和互斥控制的takeBuf操作
	public Buffer_in getBuf(List<Buffer_in> type) {
		Buffer_in temp = null;
		synchronized (type) {
			temp = takeBuf(type);
		}
		return temp;
	}

	// 3.将buffer插入type类型队列尾
	public void addBuf(List<Buffer_in> type, Buffer_in buffer) {
		type.add(type.size(), buffer);
	}

	// 4.包含了同步和互斥控制的addBuf操作
	public void putBuf(List<Buffer_in> type, Buffer_in buffer) {
		synchronized (type) {
			addBuf(type, buffer);
		}
	}

	public Test() {
		emq = new ArrayList<Buffer_in>();
		inq = new ArrayList<Buffer_in>();
		outq = new ArrayList<Buffer_in>();
		buffer = new Buffer_in[30];
		for (int i = 0; i < 30; i++) {
			buffer[i] = new Buffer_in();
			buffer[i].setBufNo(i);
			buffer[i].setBuf(0);
			emq.add(buffer[i]);
		}

		Input input = new Input(this);
		input.start();
		Output output = new Output(this);
		output.start();
		Compute compute = new Compute(this);
		compute.start();
	}

	class Buffer_in {
		// 1.缓冲区号
		private int BufNo;
		// 2.缓冲区内容
		private int buf;

		public int getBufNo() {
			return BufNo;
		}

		public void setBufNo(int bufNo) {
			BufNo = bufNo;
		}

		public int getBuf() {
			return buf;
		}

		public void setBuf(int buf) {
			this.buf = buf;
		}
	}

	class Input extends Thread {
		public Scanner sc;// 输入内容
		private int a;
		public Test main;

		public Input(Test main) {
			this.main = main;
		}

		public void run() {
			sc = new Scanner(System.in);
			while (true) {
				try {
					sleep(600);
				} catch (Exception e) {
					e.printStackTrace();
				}
				// a=sc.nextInt();//进行数据输入
				a = (int) (Math.random() * 100);// 避开手动输入的麻烦,2者选一
				if (main.emq.size() != 0) {// 首先要判断空队列是否为空
					Buffer_in hin = main.getBuf(main.emq);// 获取空闲缓冲池
					hin.setBuf(a);// 将输入数据(整型数)写入hin
					main.putBuf(main.inq, hin);// 将输入的缓冲池挂到输入队列里面
					System.out.println("输入进程:     缓冲单元" + hin.getBufNo()
							+ "  收容输入: data=" + hin.getBuf());
				}
			}
		}
	}

	class Output extends Thread {
		public Test main;

		public Output(Test main) {
			this.main = main;
		}

		public void run() {
			while (true) {
				try {
					sleep(1000);// 休息2秒
					if (main.outq.size() != 0) {
						Buffer_in sout = main.getBuf(main.outq);// 获取输出缓冲池
						System.out.println("输出进程:     缓冲单元" + sout.getBufNo()
								+ "  提取输出: data=" + sout.getBuf());
						sout.setBuf(0);
						main.putBuf(main.emq, sout);// 将输入的缓冲池挂到输入队列里面
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}

	}

	class Compute extends Thread {
		public Test main;

		public Compute(Test main) {
			this.main = main;
		}

		public void run() {
			while (true) {// 5.计算流程提取输入和收容输出
				try {
					sleep(200);
					if ((main.inq.size() != 0) && (main.emq.size() != 0)) {
						Buffer_in sin = main.getBuf(main.inq);
						int temp = sin.getBuf();
						System.out.println("计算进程:     缓冲单元" + sin.getBufNo()
								+ "  提取输入: data=" + sin.getBuf());
						main.putBuf(main.emq, sin);
						temp = temp + 10000;// 模拟计算
						Buffer_in hout = main.getBuf(main.emq);
						hout.setBuf(temp);
						main.putBuf(main.outq, hout);
						System.out.println("计算进程:     缓冲单元" + hout.getBufNo()
								+ "  收容输出: data=" + hout.getBuf());
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}

	public static void main(String[] args) {
		new Test();
	}
}


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...