数据缓冲机制是指怎样往一个队列或者链表里面不停的存放以及删除数据。以下用最简单的模型实现,即用一个队列,里面最多存放一个数据,并且一直在不停地存放,删除。
以下有两种方式实现,第一种,使用传统的链表实现。
//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();
}
}
分享到:
相关推荐
在视频会议系统中,服务器端多媒体数据流的存储转发有其特殊的背景和要求,因而需要一个高性能的多媒体数据流的缓冲机制,该机制的高效与否是制约视频会议系统性能的关键因素之一。在传统的生产者/消费者模型的基础...
在Oracle 8i以前的版本里,当数据块被从磁盘送进数据缓冲区的时候,数据块会被自动地放置到最近使用过的数据列表的前部。但是,这种行为从Oracle 8i开始...在本文Oracle高级教程里,会探讨Oracle数据缓冲区的内部机制。
气田信息整合旨在实现自治、分布、异构数据源的信息共享与交换,为用户提供统一的全局数据视图。...考虑到系统性能和灵活性,该平台引入数据缓冲机制,采用多种数据交换策略,以XML作为数据交换和元数据表示的标准。
对Internet/Intranet、实时/非实时等不同的网络环境提供广泛的通讯与数据交换支持,并能对系统瘫痪网络故障等意外情况下的数据交换提供可跟踪可控制的数据缓冲机制,为企业应用系统提供了高可靠高性能的通讯保障。...
在本篇Oracle高级教程里,将探讨Oracle数据缓冲区的内部机制——Oracle用这一内存来防止不必要的数据块从磁盘重读。理解Oracle数据缓冲区如何操作,是成功地运用它们调整数据库性能的关键。
播放PCM音频数据的双缓冲用法
stm32定时器+ADC+DMA+双缓冲 实现数据采集
SQL 缓存依赖是.NET Framework2.0里新增的一个功能,当表中或特定行中发生更改时,带有依赖项的项(缓存数据)便会失效,并会从缓存中移除。并重新读取数据到缓存中,这时候应用程序获取的是最新的数据。
用C代码实现乒乓内存缓冲机制,具体实用价值,帮助您提高内存响应速度与及时数据的处理。
异构多处理器体系下缓冲机制研究.pdf
最近花了半个多月的时间研读android源码中处理httplivestreaming的部分,其中包含了如何处理.m3u8文件,android内部如何缓冲视频流,包括后台线程始终获取数据缓冲的过程,以及缓冲没有命中时如何处理的等等,大致还...
从Oracle 8i开始,随着64位寻址的出现,你就能够创建一个完全在数据缓冲区里缓冲的数据库。现今,任何数据库通常只用不到20G的内存就能够被完全缓冲,而更大的数据库仍然需要部分数据缓冲区。要利用完全数据缓冲的...
很经典很详细的pdf资料整理,让你快速明白tcp内核缓冲机制,不用再为send、recv而担忧
T-Bit路由器中支持QOS高速大容量缓冲机制的研究.pdf
此循环缓冲区用于缓冲实时流媒体数据,以不定长度的数据块为存取单位,符合FIFO规则。 特征: 1、封装成了一个类,便于代码重用; 2、采用Mutex作为读取同步机制; 3、可设置缓冲区内的最多块的数量;
实现了多数据库中间件中分布异构数据缓冲区,该模型能够实现分布异构数据对象的数据双向同步/异步更新机制;采用的全局数据对象存储模型和缓存管理使数据在缓冲区存储并被用户高效快捷地访问;实现了全局事务管理...
为避免创建缓冲区过程中必须指定大小和多次释放而导致...在基于研究平台S3C44B0X的Web server网络数据监控系统上的测试结果表明,该缓冲区的设计满足嵌入式系统网络通信的应用需求,是一种高效、可靠的缓冲区管理机制。
利用VFP9开发的统计软件。一个PRG文件,实现全部功能。运行速度快,不用安装。针对企业统计数据管理,运行在WINDOWS平台。实现数据录入、数据查询、...对于超大量数据,采用数据缓冲机制。不依赖OFFICE读写EXCEL文件。
银行:点评TLAC管理办法和逆周期缓冲机制:资本要求提升或促使银行利润释放.pdf
试写出利用信号量机制实现两者共享单缓冲区的同步算 法。P33 [分析及相关知识] 在本题中采集任务与计算任务共用一个单缓冲区.当采集 任务采集到一个数据后,只有当缓冲区为空时才能将数据送入缓冲区中存放,否则应...