Chinaunix首页 | 论坛 | 博客
  • 博客访问: 258079
  • 博文数量: 56
  • 博客积分: 1264
  • 博客等级: 中尉
  • 技术积分: 491
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-19 15:16
文章分类

全部博文(56)

文章存档

2012年(10)

2011年(46)

分类: 嵌入式

2011-09-19 11:19:31

在数据采取时,经常用户缓冲器来暂时存放数据,显然,此时一定要有一个相互排斥机制以防止生产者和消费者进程同时对这个缓冲器中的同一个元素进行存取。同时,系统还要确保缓冲器已满时生产者进程不再试着往里添加信息,消费者进程在缓冲器为空时也不去取信息。

具体实现如下:

view plaincopy to clipboardprint?
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 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;
                       
        }

}
  

完整代码如下(仅供学习参考):

view plaincopy to clipboardprint?
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();   
  
    }   
}  
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();

        }
}








本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jicheng687/archive/2009/12/11/4987357.aspx
阅读(1768) | 评论(0) | 转发(0) |
0

上一篇:AudioRecord录制pcm

下一篇:java播放PCM文件

给主人留下些什么吧!~~