//测试生产者消费者模式,创建缓冲区 //创建生产者与消费者线程 //定义馒头类 class ManTou{ private int id; public int getId() { return id; } public void setId(int id) { this.id = id; } } //定义缓冲区 class SyncStack{ //就是一个存放数据的地方,不需要实现Runnable接口也不需要继承Thread //定义存放馒头的盒子 private ManTou[] mt = new ManTou[10]; //定义操纵盒子的索引 private int index;//默认为0 //放馒头 public synchronized void push(ManTou mantou){ //判断盒子是否已满 while(this.index==this.mt.length){ try { //Object类下的一个方法,执行后,线程会将持有的对象锁释放,并进入阻塞状态。其他需要该对象锁的线程可以继续运行。该方法必须在synchronized块中调用 this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.notify();//唤醒取馒头的线程 this.mt[this.index] = mantou; this.index++; } //取馒头 public synchronized ManTou pop() { while (this.index == 0) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //该方法必须要在synchronized块中调用。会唤醒处于等待状态队列当中的一个线程 this.notify();//唤醒生产馒头的线程 this.index--; return this.mt[this.index]; } } //定义生产者线程类 class Producer extends Thread{ private SyncStack ss; public Producer(SyncStack ss){ this.ss = ss; } @Override public void run() { for(int i=0;i<10;i++){ ManTou mt = new ManTou(); mt.setId(i); System.out.println("生产馒头:"+mt.getId()); this.ss.push(mt);//调用push方法把馒头放到定义好的缓冲区(数组)里 } } } //定义消费者线程 class Consumer extends Thread{ private SyncStack ss;//和生产者是同一个缓冲区 public Consumer(SyncStack ss){ this.ss = ss; } @Override public void run() { for(int i=0;i<10;i++){ ManTou mt = this.ss.pop(); System.out.println("消费馒头:"+mt.getId()); } } } public class TestProduceThread { public static void main(String[] args) { //创建缓冲区 SyncStack ss = new SyncStack(); //创建生产者线程 new Producer(ss).start(); //创建消费者线程 new Consumer(ss).start(); } }
为什么我的结果每一次都是生产者生产完再是消费者消费?这难道不是一个并发的过程吗?应该我生产了就提醒消费者取了呀,但是消费者等生产完才取的
为什么this.index--一定要放在上面,放在下面或写成return
this.mt[this.index--];就会空指针报错?
this.mt[this.index]
怎么用让步实现computer在coding前面?
我好无语,我打开目录,里面没有add as library的选项啊,我吐了。然后我把jar包用鼠标左键拖进目录里了。
为什么用字符流也可以,他的要求是只要是节点流就ok吗,无论字节流或字符流,如果是字节流的话会自动帮你转为字符流?
我想调用对象中的方法,可是却不行是怎么回事?我已经转为User对象了呀
这个br不需要关吗?
Inet4Address和Inet6Address和InetAddress有什么差别?
生成@param注释的快捷键是啥
输入文本这里用\r或者\n都可以实现换行,为什么要两个一起写,回车+换行一起写的意义是什么
请问我用trycatch的语法糖可以吗,这样还需要写finally吗?还有我的txt文件内容是:kjl牛逼,结果它输出了kjl,牛逼输出却乱码是咋回事,setting-encoding上我全部改为utf-8也不行
这和前面学的Filereader,有啥不同吗
这个视频9分30s的那个例子是啥意思啊?没听懂
Object next(); //返回游标当前位置的下一个元素并将游标移动到下一个位置;
Object next();
应该是返回游标当前位置的元素并将游标移动到下一个位置吧?
非常抱歉给您带来不好的体验!为了更深入的了解您的学习情况以及遇到的问题,您可以直接拨打投诉热线:
我们将在第一时间处理好您的问题!
关于
课程分类
百战程序员微信公众号
百战程序员微信小程序
©2014-2026百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园网站维护:百战汇智(北京)科技有限公司 京公网安备 11011402011233号 京ICP备18060230号-3 营业执照 经营许可证:京B2-20212637