Java中多线程通信实例:生产者消费者模式
来源:互联网 发布:淘宝美版ac68u 编辑:程序博客网 时间:2024/05/22 09:46
线程间的通信:其实就是多个线程在操作同一个资源,但是操作的动作不同
当某个线程进入synchronized块后,共享数据的状态不一定满足该线程的需要,需要其他线程改变共享数据的状态后才能运行,而由于当时线程对共享资源时独占的,它必须解除对共享资源的锁定的状态,通知其他线程可以使用该共享资源。
Java中的 wait(),notify(),notifyAll()可以实现线程间的通信。
生产者–消费者问题是典型的线程同步和通信问题
- 生产者生产出产品,消费者去购买产品
- 创建三个线程,一个主控线程,一个生产者线程,一个消费者线程,
- 创建一个堆栈 Stack,生成线程生成的产品放置到堆栈中,然后消费者线程在堆栈中取走产品
/** * 创建一个堆栈 Stack,生产者线程生成的产品放置到堆栈中,然后消费者线程在堆栈中取走产品 * Created by ZhangJun on 2017/10/21. */public class ProductStack { private int index = 0; private String[] datas = new String[5]; /** * 生成产品的方法 * * @param product */ public synchronized void setProduct(String product) { // 如果堆栈满了,调用wait()等待消费者取走产品 while (index == datas.length) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } // 生产者被唤醒后,开始放置产品到堆栈中 this.notify(); datas[index] = product; System.out.println("生产者生产产品:" + product); } /** * 获取产品的方法 * * @return product */ public synchronized String getProduct() { // 如果堆栈是空的,调用wait()等待生产者生产产品 while (index == 0) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } // 消费者被唤醒后,开始从堆栈取走产品,然后通知生产者继续生产产品 this.notify(); index--; System.out.println("消费者消费产品:" + datas[index]); return datas[index]; }}
/** * 生产者类 * Created by ZhangJun on 2017/10/21. */public class Producer extends Thread { private ProductStack mProductStack; public Producer(ProductStack ps) { this.mProductStack = ps; } @Override public void run() { //生产线程 String[] str = {"娃哈哈", "百事可乐", "鲜橙多", "伊利优酸乳", "雪碧", "冰红茶"}; int random = (int) (Math.random() * str.length); System.out.println(str[random]); for (String aStr : str) { mProductStack.setProduct(aStr); } }}
/** * 消费者类 * Created by ZhangJun on 2017/10/21. */public class Consumer extends Thread { private ProductStack mProductStack; public Consumer(ProductStack ps) { this.mProductStack = ps; } @Override public void run() { //消费线程 String[] products = new String[6]; for (int i = 0; i < products.length; i++) { products[i] = mProductStack.getProduct(); } System.out.println("消费者消费的所有产品:" + products); }}
/** * 主控线程 main * Created by ZhangJun on 2017/10/21. */public class Main { public static void main(String[] args) { ProductStack productStack = new ProductStack(); new Producer(productStack).start(); new Consumer(productStack).start(); }}
阅读全文
0 0
- Java中多线程通信实例:生产者消费者模式
- JAVA多线程-线程间通信(二)-生产者/消费者模式实现
- Java多线程编程3--线程间通信--生产者/消费者模式
- Java多线程之线程间通信--生产者/消费者模式
- java多线程 ----生产者消费者模式
- Java多线程 --- 生产者消费者模式
- Java多线程 生产者消费者模式
- java多线程---生产者消费者模式
- java 多线程 生产者消费者模式
- 【Java多线程】生产者消费者模式
- Java多线程-通信之生产者和消费者
- Java多线程编程中生产者-消费者模式的详解
- Java多线程编程中生产者-消费者模式的详解
- 多线程:生产者消费者实例
- 经典多线程Java实例 生产者与消费者
- JAVA多线程实例(生产者与消费者问题)
- Java多线程之生产者消费者实例
- 关于Java多线程生产者消费者实例
- 不刷新页面的登录框(基于Thinkphp)
- 表、栈、队列联系
- 在x86汇编中使用C语言的全局变量
- BZOJ 4505 K个串 主席树标记永久化
- JS纵深学习记录
- Java中多线程通信实例:生产者消费者模式
- 对角矩阵
- -PC.CRASH.v8.0 交通事故再现软件.iso
- Some notes as a beginner.
- GitHub客户端操作1--仓库相关操作&github团队协作流程
- Tomcat部署时war和war exploded区别以及平时踩得坑
- SpringMVC定时器使用
- 有关list和dic包含中文字符时出现乱码的解决办法
- Mysql事务处理(php代码)