生产者-消费者模型
来源:互联网 发布:sql语句查询时间段 编辑:程序博客网 时间:2024/06/09 21:34
写在开头:这个不是原创的,代码不知道在哪儿看到的(如果侵权,请联系我)。
新手,大家一起学习吧。
这里用盘子和鸡蛋。盘子作为临界资源。
1,作为生产者:如果盘子是空的,则获取盘子,放置鸡蛋,然后释放盘子;否则等待。
2,作为消费者:如果盘子有鸡蛋,则获取盘子,拿取鸡蛋,然后释放盘子;否则等待。
先来一个盘子。一个list放鸡蛋,有拿鸡蛋和放鸡蛋方法。
/** * 生产者-消费者模型 * 互斥模型 */package org.michael.plate;import java.util.ArrayList;import java.util.List;public class Plate { List<Object> eggs = new ArrayList<Object>(); /** * 拿鸡蛋 * @return 鸡蛋 */ public synchronized Object getEgg(){ while(eggs.size() == 0){ try{ this.wait(); }catch(InterruptedException e){ } } Object egg = eggs.get(0);//拿鸡蛋 eggs.clear();//清空盘子 notify();//唤醒阻塞队列的某线程到就绪队列 System.out.println("i get an egg!"); return egg; } /** * 放鸡蛋 * @param egg 鸡蛋 */ public synchronized void putEgg(Object egg){ while(eggs.size() > 0){ try{ this.wait(); }catch(InterruptedException e){ } } eggs.add(egg);//放入鸡蛋 notify();//唤醒阻塞队列的某线程到就绪队列 System.out.println("i put an egg!"); }}
再来一个生产者(放鸡蛋):
package org.michael.plate;/** * 放鸡蛋线程 * @author Michael * */public class PutEggThread extends Thread{ private Plate plate; private Object egg=new Object(); public PutEggThread(Plate plate){ this.plate = plate; } public void run(){ for(int i=0; i<5; i++){ plate.putEgg(egg); } }}
消费者(拿鸡蛋):
package org.michael.plate;/** * 拿鸡蛋线程 * @author Michael * */public class GetEggThread extends Thread{ private Plate plate; public GetEggThread(Plate plate){ this.plate = plate; } public void run(){ for(int i=0;i<5;i++){ plate.getEgg(); } } }
主函数:
package org.michael.plate;/* * 生产者-消费者模型测试类 */public class mainFunc { public static void main(String[] args) { System.out.println("生产者-消费者测试开始:"); Plate plate = new Plate(); Thread putEggs = new PutEggThread(plate); Thread getEggs = new GetEggThread(plate); putEggs.start(); getEggs.start(); try { // 等子线程执行完 putEggs.join(); getEggs.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("生产者-消费者测试完成。"); }}
输出结果:
生产者-消费者测试开始:i put an egg!i get an egg!i put an egg!i get an egg!i put an egg!i get an egg!i put an egg!i get an egg!i put an egg!i get an egg!生产者-消费者测试完成。
0 0
- 生产者-消费者模型
- 生产者/消费者模型
- 生产者 消费者模型
- 生产者消费者模型
- 生产者&&消费者模型
- 模拟生产者/消费者模型
- 生产者消费者模型
- 生产者消费者模型
- 生产者与消费者模型
- 生产者/消费者模型
- 生产者与消费者模型
- 生产者/消费者模型
- 生产者消费者模型
- 生产者消费者模型
- 生产者消费者模型
- 生产者消费者模型 ArrayBlockingQueue
- 生产者消费者模型
- 生产者消费者模型 - Storage
- Java程序员从笨鸟到菜鸟之(七十九)细谈Spring(八)spring+hibernate整合基本详解
- 立体匹配之(二):[MC-CNN] 2015CVPR: Stereo Matching by Training a Convolutional Neural Netw
- 鸿洋大婶:自定义ViewGroup------流式标签布局
- linux 栈溢出学习之return_to_dl-resolve
- Java程序员从笨鸟到菜鸟之(八十)细谈Spring(九)spring+hibernate声明式事务管理详解
- 生产者-消费者模型
- 基本的SQL概念及语法
- Java Web基础——Action+Service +Dao三层的功能划分
- git简单操作
- DFS深度优先搜索(6)--hdu1455(经典深搜+剪枝)
- 浙工大15新生赛 M大爷与数学题(最后一题)
- Java程序员从笨鸟到菜鸟之(八十一)细谈Spring(十)深入源码分析Spring之HibernateTemplate 和HibernateDaoSupport
- 欢迎使用CSDN-markdown编辑器
- 用python从数据库导入数据到excel中