首页 > 代码库 > 线程的生产者消费者复习
线程的生产者消费者复习
采用JAVA多线程技术,设计实现一个符合生产者和消费者问题的程序:对一个枪膛进行操作,其最大容量是12颗子弹,生产者线程是一个压入线程,它不断向枪膛中压入子弹;消费者线程是一个射出线程,它不断从枪膛中射出子弹。
public class ShengChanZheXiaoFeiZhe { public static void main(String[] args) { Container c = new Container(); BulletProducer producer = new BulletProducer(c); BulletConcumer consumer = new BulletConcumer(c); Thread t1 = new Thread(producer); Thread t2 = new Thread(consumer); t1.start(); t2.start(); } } //子弹类,id为序号 class Bullet{ int id; Bullet(int id){ this.id = id; } //重写toString方法,便于显示子弹序号。 @Override public String toString() { return "第"+id+"个子弹"; } } //装子弹的容器,具备一定空间,含有装子弹和发子弹的同步方法(是一个栈),方法需要判断栈的空和满,并使用等待唤醒机制控制。 class Container{ Bullet[] arr = new Bullet[12]; int index = 0; public synchronized void push(Bullet bullet){ while(index==arr.length){ try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.notify(); arr[index] = bullet; index++; } public synchronized Bullet pop(){ while(index==0){ try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.notify(); index--; return arr[index]; } } //生产者,需要被一个线程执行故实现runnable接口,run方法中初始化子弹容器,不断建立子弹对象并向容器中push,并输出子弹序号。 class BulletProducer implements Runnable{ Container c = null; public BulletProducer(Container c) { this.c = c; } public void run(){ int i = 0; while(true){ Bullet bullet = new Bullet(++i); c.push(bullet); System.out.println("上膛"+bullet); } } } //消费者,也实现了runnable,建立容器,不断从容器中pop子弹,并输出子弹序号。 class BulletConcumer implements Runnable{ Container c = null; public BulletConcumer(Container c) { this.c = c; } public void run(){ while(true){ Bullet bullet = c.pop(); System.out.println("->->->->->->发射"+bullet); } } }
线程的生产者消费者复习
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。