Java基础复习:线程通信—生产者消费者改进
来源:互联网 发布:淘宝欧斯曼真皮双肩包 编辑:程序博客网 时间:2024/05/29 14:09
在前面的生产者消费者程序中,生产者一次生产的数据,消费者可以进行多次读取。显然,这并不符合我们的要求。对此,改进上述程序:
1)生产者生产一次数据,消费者取一次数据;
2)存储空间只能存放一对数据
在下面的代码中我们会用到:
Java通过Object类的 wait \ notify \ nofifyall 这几个方法来实现线程间的通信。
wait: 告诉当前线程放弃监视器并进入睡眠状态,知道其他线程进入同一监视器并调用notify为之。
notify: 唤醒同一对象监视器中调用wait的第一个线程。用于类似饭馆有一个空位后通知所有等候就餐的骨科中的第一位可以入座的情况。
notifyall:
唤醒同一对象监视器中调用wait的所有线程,且有最高优先级的线程首先被唤醒并执行,用于类似某个不定期的培训班终于招生满额后,通知所有学员来上课的情况。
wait \ notify \ nofifyall 这三个方法只能在 synchronized 方法中调用,即线程必须要先得到该对象的锁旗标。
package day14;/** * 数据存储区,并设置了默认生产的内容 * * @author well * */class Storage {String name = "Tom";String sex = "male";/** * 存储区的状态,无数据时为false,有数据时为true */boolean sFull = false;/** * 放数据 * * @param name * @param sex */public synchronized void put(String name, String sex) {//当存储区有数据时等待while(sFull){try {wait();} catch (InterruptedException e) {e.printStackTrace();}}this.name = name;try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}this.sex = sex;sFull = true;//放完数据,设置数据区为满状态notify();//唤醒等待队列的消费者进程}/** * 取数据 */public synchronized void get() {while(!sFull){try {wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(name + "," + sex);sFull = false;//取走数据后,设置数据区为空notify();//唤醒等待队列的生产者进程}}/** * 生产者进程 * * @author well * */class Producer implements Runnable {Storage s = null;Producer(Storage s) {super();this.s = s;}@Overridepublic void run() {int i = 0;for (; i < 500; i++) {if (i % 2 == 0) {s.put("Lily", "female");} else {s.put("Tom", "male");}}}}/** * 消费者进程 * * @author well * */class Consumer implements Runnable {Storage s = null;Consumer(Storage s) {super();this.s = s;}@Overridepublic void run() {for (int i = 0; i < 500; i++) {s.get();}}}public class PCDemo {public static void main(String[] args) {Storage s = new Storage();new Thread(new Producer(s)).start();new Thread(new Consumer(s)).start();}}
- Java基础复习:线程通信—生产者消费者改进
- Java基础复习:线程通信、生产者消费者
- 黑马程序员--JAVA基础复习之多线程(三)线程间通信 生产者消费者
- java线程通信-生产者消费者
- java基础12:线程间通信---生产者消费者问题
- Java基础----生产者消费者问题改进版
- 【java基础】多线程--生产者消费者--复习
- java多线程线程通信——生产者和消费者
- 线程通信,生产者消费者问题(Java)
- JAVA 线程间通信 - 生产者与消费者
- JAVA 线程间通信 - 生产者与消费者
- java线程间通信:生产者--消费者
- java线程通信 生产者与消费者模式
- java线程通信--生产者消费者问题
- JAVA线程间通信(生产者消费者)
- Java基础——线程间的通信+生产者消费者程序+守护线程+Join方法+线程优先级
- 线程的生产者消费者复习
- 线程通信举例——生产者、消费者
- php 定时输出
- 代码
- 使用SourceInsight阅读NS源代码
- 获取JPassword中的内容
- Tor源码文件分析 -- Hibernation
- Java基础复习:线程通信—生产者消费者改进
- java的中文字符编码问题-控制台输出
- 简单的字符串近似匹配
- jdbc连接mysql之url书写
- 多线程服务器的适用场合
- android模拟器无法启动
- linux应用开发中经常用到的命令
- 非递归实现交换二叉树的左右子节点
- android 制作9.png图片