java多线程--生产者和消费者模型
来源:互联网 发布:淘宝宝贝批量上架 编辑:程序博客网 时间:2024/05/17 01:47
在开始我们先介绍wait和notifyAll这两个方法。这两个方法是Object类的方法,并且是native方法。
(1)调用某个对象的wait()方法能让当前线程阻塞,并且当前线程必须拥有此对象锁。
(2)调用notifyAll()方法能够唤醒所有正在等待这个对象的锁线程;只能唤醒等待该想拥有该对象锁的线程,因此我们需要保证对象的同一性。
生产者代码:
public Producer implements Runnable{ /**生产出来苹果剩余数量*/ public static int remainCount = 0; /**总共生产的苹果数量*/ public static int pCount = 0; /**苹果最大剩余量*/ public static int maxCount = 100; /**对象锁*/ private Object obj = null; public Producer(Object obj){ this.obj = obj; } private void producer(){ remainCount++; System.out.println(Thread.currentTread() + ":正在生产第" + (++pCount) + "苹果"); } public void run(){ while(true){ //同步代码块,持有obj对象锁 synchronized (obj) { if (remainCount < pMaxCount) { producer(); } else { try { obj.wait(); //不能唤醒自己,唤醒其他想持有该对象锁的线程 } catch (InterruptedException e) { e.printStackTrace(); } } obj.notifyAll(); } try { Thread.sleep(1500); } catch (InterruptedException e) { e.printStackTrace(); } } }}
消费者
public class Consumer implements Runnable { /**消费苹果的数量*/ public static int cCount = 0; private Object obj; public Consumer(Object obj) { this.obj = obj; } @Override public void run() { while (true) { //与生产者要持有相同的对象 synchronized (obj) { if (Producer.remainCount > 0) { consumer(); } else { try { obj.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } obj.notifyAll(); } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } public void consumer() { Producer.remainCount--; System.out.println(Thread.currentThread() + ":正在消费第" + (++cCount) + "个苹果"); }}
主函数
public class Main { public static void main(String[] args) { new Main().proAndcon(); } private void proAndcon() { Object obj = new Object(); //生产者和消费者要持有的对象 Thread tP1 = new Thread(new Producer(obj)); tP1.start(); Thread tP2 = new Thread(new Producer(obj)); tP2.start(); Thread tC1 = new Thread(new Consumer(obj)); tC1.start(); Thread tC2 = new Thread(new Consumer(obj)); tC2.start(); }}
0 0
- java多线程之生产者和消费者模型
- java多线程--生产者和消费者模型
- java多线程生产者、消费者模型
- Java多线程 -- 生产者消费者模型
- Java 多线程:生产者消费者模型
- Java 多线程:生产者消费者模型
- 多线程模型:生产者和消费者
- Java多线程五:生产者和消费者模型(单个对单个)
- Java多线程六:生产者和消费者模型(多对多)
- JAVA 生产者和消费者模型
- Java 多线程 生产者和消费者
- Java多线程-生产者和消费者
- 多线程---生产者-消费者模型
- Java SE -- 多线程 生产者消费者模型
- JAVA实现多线程生产者消费者模型
- Java实现生产者消费者模型:多线程+BlockingQueue
- Java多线程-并发协作(生产者消费者模型)
- 【Java 多线程】简单生产者消费者模型
- 基于Dubbo框架构建分布式服务
- 都在说EventBus,我也来一波EventBus
- ios app图片角标
- Codeforces 612D The Union of k-Segments 【思维】
- eclipse 的一些小知识
- java多线程--生产者和消费者模型
- MEAN.IO和MEAN.JS有什么区别
- 在myeclipse中maven部署流程及遇见的问题
- linux下安装MySQL出错file /usr/share/mysql/charsets/latin2.xml from install of MySQL-......
- C# 哈希表Hashtable与字典表Dictionary<K,V>的比较。
- NHibernate could not get or update next value[SQL: ] 对象名 'hibernate_unique_key' 无效。
- C++的学习技巧!
- 2016随笔
- iOS 终端导出推送p12 文件