环形缓冲器Java实现
来源:互联网 发布:华中数控编程软件 编辑:程序博客网 时间:2024/06/10 19:10
在数据采取时,经常用缓冲器来暂时存放数据,显然,此时一定要有一个相互排斥机制以防止生产者和消费者进程同时对这个缓冲器中的同一个元素进行存取。同时,系统还要确保缓冲器已满时生产者进程不再试着往里添加信息,消费者进程在缓冲器为空时也不去取信息。
具体实现如下:
- package app;
- public class CircularBuffer {
- int bufsize;
- SensorRecord[] store;
- int numberOfEntries = 0;
- int front = 0;
- int back = 0;
- CircularBuffer(int n){
- bufsize = n;
- store = new SensorRecord[bufsize];
- }
- /**
- * 存放数据
- * @param rec要存放的数据对象
- * @throws InterruptedException
- */
- synchronized void put(SensorRecord rec) throws InterruptedException{
- if(numberOfEntries == bufsize)
- wait();
- store[back] = new SensorRecord(rec.num, rec.degree);
- System.out.println("put " + rec.toString());
- back = back + 1;
- if(back == bufsize)
- back = 0;
- numberOfEntries += 1;
- notify();
- }
- /**
- * 取出数据
- * @return
- * @throws InterruptedException
- */
- synchronized SensorRecord get() throws InterruptedException{
- SensorRecord result = new SensorRecord(-1,-1);
- if( 0 == numberOfEntries )
- wait();
- result = store[front];
- System.out.println("get " + result.toString());
- front += 1;
- if(front == bufsize)
- front = 0;
- numberOfEntries -= 1;
- notify();
- return result;
- }
- }
完整代码如下(仅供学习参考):
- package app;
- public class BufferPool {
- public static CircularBuffer buf = new CircularBuffer(100);
- }
- package app;
- public class Get implements Runnable {
- public void run() {
- while (true) {
- try {
- Thread.sleep(1000);
- BufferPool.buf.get();
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- }
- package app;
- public class Put implements Runnable {
- public void run() {
- while (true) {
- int num = (int) (Math.random() * 1000);
- int degree = (int) (Math.random() * 1000);
- SensorRecord rec = new SensorRecord(num, degree);
- try {
- Thread.sleep(10);
- BufferPool.buf.put(rec);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- }
- package app;
- public class SensorRecord {
- public SensorRecord(int num2, int degree2) {
- // TODO Auto-generated constructor stub
- this.num = num2;
- this.degree = degree2;
- }
- int num;
- int degree;
- public String toString(){
- return new String("num: " + num + "; degree: " + degree);
- }
- }
- package app;
- public class TestBuffer {
- /**
- * @param args
- */
- public static void main(String[] args) {
- Get get = new Get();
- Put put = new Put();
- Thread thread = new Thread(get);
- Thread thread2 = new Thread(put);
- thread.start();
- thread2.start();
- }
- }
- 环形缓冲器Java实现
- 环形缓冲器Java实现
- 环形缓冲器
- 环形缓冲器(转)
- 环形缓冲器(转)
- 简单实用的环形缓冲器
- Java实现环形队列
- Java实现环形队列
- 环形缓冲器 circular buffer, ring buffer
- java 环形队列简单实现
- java nio缓冲器(转)
- java nio缓冲器
- 缓冲器
- java-线程并发-缓冲器-模拟
- 环形缓冲区(JAVA数组实现)
- 环形缓冲区(JAVA数组实现)
- java之环形队列的实现
- java 环形阻塞队列简单实现
- Hadoop Futures at Structure Big Data: DataStax Brisk, EMC, and MapR
- 启用RMAN块修改跟踪&差异备份和增量备份的区别!
- js 调用 exe
- 使用JavaScript和Canvas开发游戏(一)
- 组合android的theme属性
- 环形缓冲器Java实现
- 使用JavaScript和Canvas开发游戏(二)
- 乔布斯在斯坦福大学毕业典礼上的演讲:我生命中的三个故事
- MyEclipse中创建项目(No.25)
- telnet使用命令介绍
- 缓存的一种实现
- Flash Socket安全问题的全面解析
- 网页视频播放器代码大全
- JavaScript 工作线程实现方式