java线程学习——汉堡销售问题
汉堡店中有一个负责做汉堡的厨师,一个负责销售的营业员,用java线程表示他们的营业过程:
问题原型就是生产者与消费者的问题。
首先定义一个汉堡包箱子类与几个相关的变量类:
public class Ham
{
static Object box=new Object(); //制作汉堡的箱子
static int totalMaterial=6; //制作汉堡的材料的量(10个汉堡)
static int sales=0; //汉堡包的销售量
static int production=3; //汉堡包的产量,光顾之前有3个
}
再来定义厨师类:
public class HMaker extends Thread { //厨师类
void make() //制作一个汉堡,通知营业员
{
synchronized(Ham.box)
{
Ham.production++;
System.out.println("厨师:这里有汉堡!!(总"+Ham.production+"个)");
Ham.box.notify(); //通知营业员
}
}
public void run()
{
while(Ham.production<Ham.totalMaterial) //不能超过材料数目
{
try
{
sleep(3000);
}catch(InterruptedException ie){}
make(); //制作一个汉堡
}
}
}
营业员类定义如下:
public class HAssistant extends Thread{ void sell() //销售一个汉堡
{
synchronized(Ham.box)
{
if(Ham.production==Ham.sales)
{
try{
Ham.box.wait(); //没有汉堡了唤醒厨师
}catch(InterruptedException ie){}
}
Ham.sales++;
System.out.println("营业员:顾客朋友们,汉堡上来了.(总"+Ham.sales+"个)");
}
}
public void run()
{
while(Ham.sales<Ham.totalMaterial)
{
System.out.println("<顾客订购汉堡.>");
sell(); //销售汉堡
try{
sleep(1000);
}catch(InterruptedException ie){}
}
}
}
主程序如下:
public class Synchronization6 {
public static void main(String[] args) {
HMaker maker=new HMaker();
HAssistant assistant=new HAssistant();
maker.start();
assistant.start();
}
}
运行结果:
<顾客订购汉堡.>
营业员:顾客朋友们,汉堡上来了.(总1个)
<顾客订购汉堡.>
营业员:顾客朋友们,汉堡上来了.(总2个)
<顾客订购汉堡.>
营业员:顾客朋友们,汉堡上来了.(总3个)
<顾客订购汉堡.>
厨师:这里有汉堡!!(总4个)
营业员:顾客朋友们,汉堡上来了.(总4个)
<顾客订购汉堡.>
厨师:这里有汉堡!!(总5个)
营业员:顾客朋友们,汉堡上来了.(总5个)
<顾客订购汉堡.>
厨师:这里有汉堡!!(总6个)
营业员:顾客朋友们,汉堡上来了.(总6个)
java线程学习——汉堡销售问题的更多相关文章
- java 线程学习
转载:详见处http://lavasoft.blog.51cto.com/62575/27069 Java多线程编程总结 下面是Java线程系列博文的一个编目: Java线程:概念与原理 ...
- Java线程学习详解
线程基础 1. 线程的生命周期 1.1 新建状态: 使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态.它保持这个状态直到程序 start() 这个线程. 1 ...
- Java线程学习笔记(两) 线程异常处理
线程捕获异常: 情况下,我们在main()方法里是捕捉不到线程的异常的,比例如以下面代码: public class ExceptionThread implements Runnable{ @Ove ...
- Java线程学习笔记(一个)
一个.正在创建的线程: 老掉牙的话题了.继承 java.lang.Thread父类或者实现Runnalbe接口.这里就提一句: class Thread implements Runnable Thr ...
- java线程学习(一)
1.简介 java基础知识部分线程创建的三种方式.线程执行的样例. 代码地址:http://git.oschina.net/blue_phantom/javaj 包位置:package com.blu ...
- 学习java线程学习笔记
线程:代码执行的一个分支 主要作用是提高了效率,cpu能同时执行多个部分的代码. 线程的创建:两种方式 a.继承于thread类,重写run方法. b. ...
- java线程学习之volatile关键字
volatile变量的主要作用:是使变量在多个线程间可见. 在java中每一个线程都会有一块工作内存区,其中存放着所有线程共享的主内存的变量值的拷贝.当线程执行时,它在自己的工作内存区操作这些变量,为 ...
- java线程学习之synchronized关键字
关键字synchronized的作用是实现线程间的同步.它的任务是对同步的代码加锁.一个代码块同时只能有同一个线程进行读和写操作,从而保证线程间是安全的. 线程安全的概念是:当多个线程访问某一个类(对 ...
- java线程学习之Sleep方法
sleep方法是在线程中常用到的一个方法,它是一个静态方法. sleep(long millis) 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度 ...
随机推荐
- hive join 优化
common join : 即reducer join,瓶颈在shuffle阶段,会产生较大的网络io: map join:即把小表放前面,扫描后放入每个节点的内存,在map阶段进行匹配: 开启map ...
- char *p 和char *p[]
char *p 和char *p[]区别 char* p是一个指针,根本没分配内存,他指向的"abc123ABC" 是只读的,不能改变,在下面给他赋值是错的 而char p[]是一 ...
- hadoop搭建杂记:Linux下ssh免密码登陆
关于ssh免密码登陆的问题 关于ssh免密码登陆的问题 linux下可以用ssh-keygen来生成公钥/私钥对 ①生成id_rsa和id_rsa.pub公钥/私钥对,自动在~/.ssh下生成文件(亦 ...
- 机器学习算法实现(R&Python code)
Machine Learning Algorithms Machine Learning Algorithms (Python and R) 明天考试,今天就来简单写写机器学习的算法 Types Su ...
- JQuery的Select操作集合
jQuery获取Select选择的Text和Value: 语法解释: $("#select_id").change(function(){//code...}); //为Sel ...
- Android 一个抽奖应用的逆向破解全流程之加固自己应用
转自: <a href="http://www.pedant.cn/2014/07/22/crack-a-draw-app/">http://www.pedant.cn ...
- npm总是安装不成功,而且很慢?
什么方法解决: 在cmd 里面先运行 npm config set registry "http://registry.npm.taobao.org" 然后再安装npm 就会很快 ...
- 专访CEO何朝曦:深信服高速成长的秘诀
在深信服公司深圳总部的办公室里,要迅速找到几位高管的工位远远不如找一位女员工的座位那样容易. 深信服CEO何朝曦先生 公司里虽然女孩很少,但几乎每位女员工的工位上都有一盆绿植.相比之下,从公司CEO何 ...
- VM Agent 和扩展程序
VM Agent 和扩展程序 - 第 1 部分 Windows Azure基础结构服务最近宣布了一项新功能VM Agent.VMAgent是一个轻量级进程,用于启动由Microsoft或合作伙伴 ...
- tpopela/vips_java
tpopela/vips_java Implementation of Vision Based Page Segmentation algorithm in Java