package mypackage; /** * @author zikui * 主测试程序 */ public class ThreadTest { public static void main(String[] args) { Data d = new Data(); //共享数据 GetBody gb = new GetBody(d); //消费者线程体 SetBody sb = new SetBody(d); //生产者线程体 Thread getThread = new Thread(gb); //消费者线程 Thread setThread = new Thread(sb); //生产者线程 //启动线程 setThread.start(); getThread.start(); } } /** * @author zikui * 消费者线程体 */ class GetBody implements Runnable { private Data d; //构造方法,接受一个Data对象 public GetBody(Data dd) { this.d = dd; } @Override public void run() { while(true) { //休眠一段时间,让生产者线程先执行,达到线程调度的目的 try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("已消费:-" + this.d.get()); } } } /** * @author zikui * 生产者线程体 */ class SetBody implements Runnable { private Data d; //构造方法,接受一个Data对象 public SetBody(Data dd) { this.d = dd; } @Override public void run() { char c[] = {'A','B','C','D','E','F','G','H','I','J', 'K','L','M','N','O','P','Q','R','S','T', 'U','V','W','X','Y','Z'}; while(true) { for(int i=0; i<c.length; i++) { this.d.set(c[i]); System.out.println("已生产:+" + c[i]); //休眠一段时间,调整生产速度,达到线程调度的目的 try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } } } } /** * @author zikui * 缓冲区对象 */ class Data { private char a[] = new char[26]; //实际已存储元素个数 private int elementsCount = 0; //向缓冲区存储一个元素 public synchronized void set(char c) { /* * 循环检测,因为wait()有可能被interrupt()所唤醒 * 如果缓冲区已满,则阻塞当前线程 */ while(this.isFull()) { try { System.out.println("缓冲区已满,生产者被阻塞........."); this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.a[this.elementsCount] = c; ++this.elementsCount; this.notify(); //生产完成,释放锁 } //消费一个元素 public synchronized char get() { /* * 循环检测,因为wait()有可能被interrupt()所唤醒 * 如果缓冲区为空,则阻塞当前线程 */ while(this.isEmpty()) { try { System.out.println("缓冲区为空,消费者被阻塞........"); this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } char c = this.a[this.elementsCount-1]; --this.elementsCount; this.notify(); //消费一个元素,释放锁 return c; } //检查缓冲区是否已满 public boolean isFull() { return this.elementsCount==this.a.length?true:false; } //检查缓冲区是否为空 public boolean isEmpty() { return this.elementsCount==0?true:false; } public int getElementsCount() { return this.elementsCount; } }