当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

数据缓冲机制

发表于: 2015-04-04   作者:旧琴房时光   来源:转载   浏览:
摘要: 数据缓冲机制是指怎样往一个队列或者链表里面不停的存放以及删除数据。以下用最简单的模型实现,即用一个队列,里面最多存放一个数据,并且一直在不停地存放,删除。 以下有两种方式实现,第一种,使用传统的链表实现。 //ZRZn类,是一个数据类型,有一个public的id属性 public class ZRZn { public int id; } //生产者,向队列里添加数据 publ
数据缓冲机制是指怎样往一个队列或者链表里面不停的存放以及删除数据。以下用最简单的模型实现,即用一个队列,里面最多存放一个数据,并且一直在不停地存放,删除。
以下有两种方式实现,第一种,使用传统的链表实现。
//ZRZn类,是一个数据类型,有一个public的id属性
public class ZRZn {
	public int id;
}
//生产者,向队列里添加数据
public class Producer extends Thread{
	private LinkedList<ZRZn> buffer;
	public Producer(LinkedList<ZRZn> buffer){
		this.buffer = buffer;
	}
	public void run(){
		int id = 0;

		while(true){
			synchronized (buffer) {
			if(buffer.size() == 0){
				id++;
				ZRZn temp = new ZRZn();
				temp.id = id;
				buffer.add(temp);
				System.out.println("向队列中加入了一个ZRZn对象,id是    "+temp.id);
				
					buffer.notify();
			}else{
			try {
				buffer.wait();
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			}
			}
		}
	}
}
//消费者,从队列里面拿出数据
public class Customer extends Thread{
	private LinkedList<ZRZn> buffer;
	public Customer(LinkedList<ZRZn> buffer){
		this.buffer = buffer;
	}
	public void run(){
		while(true){
			synchronized (buffer) {
			if(buffer.size() > 0){
				ZRZn temp = buffer.remove(0);
				System.out.println("从队列中拿出了一个ZRZn对象,id是   "+temp.id);
				buffer.notify();
			}else{
			try {
				buffer.wait();
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			}
			}
		}
	}
}
//主函数类,测试
public class Manage {
	    
	public static void main(String[] args) {
		//数据缓冲链表
	    java.util.LinkedList<ZRZn> buffer= new java.util.LinkedList<ZRZn>();
		Producer pr = new Producer(buffer);
		Customer cr = new Customer(buffer);
		pr.start();
		cr.start();
	}

}

以上方法使用常规的LinkedList链表,并运用了链表的notify()和wait()方法,用来执行存放和取出数据。
下一种是运用java.util.concurrent类里面的LinkedBlockingQueue队列,这种队列的优势是它里面自带的take()和put()方法在没有取得或者放入数据时会阻塞,这样就确保一定会一次性取出和放入数据。以下是代码,每个类的作用与上一种方法相同。
public class Customer extends Thread{
	private LinkedBlockingQueue<ZRZn> buffer;
	public Customer(LinkedBlockingQueue<ZRZn> buffer){
		this.buffer = buffer;
	}
	public void run(){
		int id = 0;
		while(true){
				id++;
				ZRZn temp = new ZRZn();
				temp.id = id;
				try {
					buffer.put(temp);
					System.out.println("向队列中加入了一个ZRZn对象,id是    "+temp.id);
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
		}
	}
}
public class Producer extends Thread{
	private LinkedBlockingQueue<ZRZn> buffer;
	public Producer(LinkedBlockingQueue<ZRZn> buffer){
		this.buffer = buffer;
	}
	public void run(){
		while(true){
				try {
					ZRZn temp = buffer.take();
					System.out.println("从队列中拿出了一个ZRZn对象,id是   "+temp.id);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}	
		}
	}
}
public class Manage {
	    
	public static void main(String[] args) {
		//数据缓冲链表
	    java.util.concurrent.LinkedBlockingQueue<ZRZn> buffer = new LinkedBlockingQueue<ZRZn>(1);
		Producer pr = new Producer(buffer);
		Customer cr = new Customer(buffer);
		pr.start();
		cr.start();
	}

}

数据缓冲机制

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
相信大多数人都知道,所谓“屏幕双缓冲”是指在内存中建立一个“图形设备上下文的缓存”,所有的绘
标准I/O库提供缓冲的目的是尽可能减少使用read和write调用的次数。它也对每个I/O流自动地进行缓冲管
看了些例子,也就简单些了些东西,希望能供给相关朋友做相关的参考,还是一样直接贴源码吧: 主类: pac
文章来源: http://publishblog.blogdriver.com/blog/tb.b?diaryID=1182919 JDBCTemplate 数据读取机
1. 手动验证的实现 只需要在继承ActionSupport类的情况下,直接重写validate()方法即可。使用valida
数据是应用的核心。下面我们来详细看看Android系统的数据存储和共享机制。 Android为我们提供了4种
本课内容属于Oracle高级课程范畴,内容略微偏向理论性,但是与数据库程序开发和管理、优化密切相关
Oracle数据完整性和锁机制 本课内容属于Oracle高级课程范畴,内容略微偏向理论性,但是与数据库程序
目录: Oracle数据完整性和锁机制 索引及优化之表分析 表分析、约束及表间关系 PPT和源码下载: htt
Redis的主从同步机制可以确保redis的master和slave之间的数据同步。按照同步内容的多少可以分为全同
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号