<JAVA学习笔记7>——生产者、消费者案例(1)
来源:互联网 发布:南昌大学网络教务平台 编辑:程序博客网 时间:2024/05/22 11:41
多线程开发中经典的案例。生产者、消费者案例
- 若在Food类中,不添加get,set方法,那么没个菜品不会和它的功能对应上。
- 程序一开始,线程将会开始抢占资源
package com.xiaofeng.example;/** * 生产者、消费者案例 * @author XiaoFeng1015 */public class TheadDemo5 { public static void main(String[] args) { Food food = new Food(); Producter p = new Producter(food); Customers c = new Customers(food); Thread t1 = new Thread(p); Thread t2 = new Thread(c); t1.start(); t2.start(); }}class Producter implements Runnable { private Food food; public Producter(Food food) { this.food = food; } @Override public void run() { for (int i = 0; i < 50; i++) { if (i % 2 == 0) { // food.setName("银耳莲子汤!"); // try { // Thread.sleep(500); // } catch (InterruptedException e) { // e.printStackTrace(); // } // food.setEfficasy("功效:美容养颜!"); food.set("银耳莲子汤!", "功效:美容养颜!"); } else { // food.setName("糖醋里脊!"); // try { // Thread.sleep(500); // } catch (InterruptedException e) { // e.printStackTrace(); // } // food.setEfficasy("功效: 酸甜可口!"); food.set("糖醋里脊!", "功效: 酸甜可口!"); } } }}class Customers implements Runnable { private Food food; public Customers(Food food) { this.food = food; } @Override public void run() { for (int i = 0; i < 50; i++) { // try { // Thread.sleep(500); // } catch (InterruptedException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } // System.out.println(food.getEfficasy() + "-->" + food.getName()); food.get(); } }}// 使用同步方法将生产和消费包裹起来。class Food { private String name; private String efficasy; public Food() { super(); } public Food(String name, String efficasy) { super(); this.name = name; this.efficasy = efficasy; } public synchronized void set(String name, String efficasy) { this.setName(name); try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } this.setEfficasy(efficasy); } public synchronized void get() { // 加休眠的目的:为了防止get在一开始时取空 try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(this.getName() + "-->" + this.getEfficasy()); } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEfficasy() { return efficasy; } public void setEfficasy(String efficasy) { this.efficasy = efficasy; }}
结果:
两种菜品会在一段时间内只显示一个,因为在访问一个同步方法时,另一个同步方法不允许被访问。
0 0
- <JAVA学习笔记7>——生产者、消费者案例(1)
- <JAVA学习笔记8>——生产者、消费者案例(2)
- java多线程学习笔记(七) ——消费者与生产者(LOCK、Condition接口)
- Java SE学习笔记:线程通信、生产者与消费者案例、线程状态(线程的生命周期)、线程操作、Condition类
- JAVA学习笔记(四十二)-生产者消费者模型
- 多线程——消费者与生产者案例
- Java生产者和消费者案例
- java生产者和消费者案例
- 多线程学习——消费者生产者(1)
- java(十六):concurrent(1)—生产者与消费者
- OS学习笔记——生产者消费者问题
- 线程同步学习笔记(生产者消费者)
- 关于Java多线程------(4,经典案例---生产者和消费者)
- 【多线程】_线程操作案例——生产者和消费者笔记
- 【多线程】_线程操作案例——生产者和消费者笔记
- 生产者/消费者问题学习笔记
- 多线程经典案例——生产者/消费者问题的Java实现与详解
- Lesson_for_java_day20--java的多线程——生产者消费者模式(优化网上生产馒头的案例)
- 关于数据库管理工具的使用----把数据库中的表等生成word文档
- 如何在Django中使用mongodb数据库?
- Block (四) block_callBack VS Protocol_Delegate
- l啦啦啦
- C语言基础 生成从min到max范围内的一个随机数
- <JAVA学习笔记7>——生产者、消费者案例(1)
- Problem J: 结构体--成绩统计
- malloc与new运算符的区别
- xampp的Apache配置
- tomcat异常信息处理 严重: IOException while loading persisted sessions: java.io.EOFException
- 新人报道
- Problem K: P1: 职工工资统计
- 我要和C先生恋爱啦
- Java学习日记 查表法十进制转十六进制