package pack01;import java.util.ArrayList;import java.util.List;/**?* 測(cè)試緩存區(qū)?* @author??*?*/public class TestBuffer { public static void main(String[] args) { List<Data> list = new ArrayList<Data>();//生成一個(gè)緩存區(qū)的儲(chǔ)存器 Buffer buffer = new Buffer(list,20);//生成一個(gè)緩存區(qū) Consumer consumer = new Consumer(buffer);//生成一個(gè)消費(fèi)者 Producer producer = new Producer(buffer);//生成一個(gè)生產(chǎn)者 new Thread(producer).start();//啟動(dòng)線程 new Thread(consumer).start(); }}class Consumer implements Runnable//消費(fèi)者{ private Buffer buffer;//為消費(fèi)者指定緩存區(qū) public Consumer(Buffer buffer) { //在構(gòu)造器中指定緩存區(qū) this.buffer = buffer; } public synchronized void consume()//消費(fèi) { if(this.buffer.dataBuffer.size() == 0) { System.out.println("緩存區(qū)中無(wú)數(shù)據(jù)可消費(fèi)!"); try { this.wait();//如果緩存區(qū)中無(wú)數(shù)據(jù)可消費(fèi) 暫停該線程 } catch (InterruptedException e) { e.printStackTrace(); } } this.buffer.dataBuffer.remove(this.buffer.dataBuffer.size()-1); this.buffer.len--;//緩存區(qū)的當(dāng)前大小減1 this.notifyAll();//消費(fèi)完畢 通知其他線程 } @Override public void run() { for(int i = 1; i < 10; i++) { this.consume(); System.out.println("消費(fèi)第"+i+"個(gè)數(shù)據(jù)"); } } }class Producer implements Runnable//生產(chǎn)者{ private Buffer buffer;//為生產(chǎn)者指定容器 public Producer(Buffer buffer) { this.buffer = buffer;//在構(gòu)造器中指定容器 } public synchronized void produce(Data data)//生產(chǎn) { if(this.buffer.dataBuffer.size() == this.buffer.maxSize)//如果緩存區(qū)的大小等于緩存區(qū)的最大大小 { System.out.println("緩存區(qū)已滿!"); try { this.wait();//如果緩存區(qū)已滿 就暫停該線程 } catch (InterruptedException e) { e.printStackTrace(); } } this.buffer.dataBuffer.add(data);//如果不等 則往緩存區(qū)中加入data this.buffer.len++;//緩存區(qū)的當(dāng)前大小加1 this.notifyAll();//生產(chǎn)完畢 通知其他線程 } @Override public void run() { for(int i = 1; i <= 20; i++) { this.produce(new Data(i)); System.out.println("生產(chǎn)第"+i+"個(gè)數(shù)據(jù)"); } }}class Buffer//緩存區(qū){ List <Data> dataBuffer;//指定一個(gè)儲(chǔ)存data的容器 int maxSize;//指定緩存區(qū)的最大大小 int len;//指定緩存區(qū)的當(dāng)前大小 public Buffer(List <Data> dataBuffer, int maxSize) { //在構(gòu)造時(shí) 設(shè)置緩存區(qū)的的大小 this.dataBuffer = dataBuffer; this.maxSize = maxSize; this.len = this.dataBuffer.size(); } }class Data{ int id;//指定id public Data(int id) { this.id = id; } }
2 回答

添加回答
舉報(bào)
0/150
提交
取消