汉堡店中有一个负责做汉堡的厨师,一个负责销售的营业员,用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线程学习——汉堡销售问题的更多相关文章

  1. java 线程学习

    转载:详见处http://lavasoft.blog.51cto.com/62575/27069   Java多线程编程总结   下面是Java线程系列博文的一个编目:   Java线程:概念与原理 ...

  2. Java线程学习详解

    线程基础 1. 线程的生命周期 1.1 新建状态: 使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态.它保持这个状态直到程序 start() 这个线程. 1 ...

  3. Java线程学习笔记(两) 线程异常处理

    线程捕获异常: 情况下,我们在main()方法里是捕捉不到线程的异常的,比例如以下面代码: public class ExceptionThread implements Runnable{ @Ove ...

  4. Java线程学习笔记(一个)

    一个.正在创建的线程: 老掉牙的话题了.继承 java.lang.Thread父类或者实现Runnalbe接口.这里就提一句: class Thread implements Runnable Thr ...

  5. java线程学习(一)

    1.简介 java基础知识部分线程创建的三种方式.线程执行的样例. 代码地址:http://git.oschina.net/blue_phantom/javaj 包位置:package com.blu ...

  6. 学习java线程学习笔记

    线程:代码执行的一个分支          主要作用是提高了效率,cpu能同时执行多个部分的代码.      线程的创建:两种方式      a.继承于thread类,重写run方法.      b. ...

  7. java线程学习之volatile关键字

    volatile变量的主要作用:是使变量在多个线程间可见. 在java中每一个线程都会有一块工作内存区,其中存放着所有线程共享的主内存的变量值的拷贝.当线程执行时,它在自己的工作内存区操作这些变量,为 ...

  8. java线程学习之synchronized关键字

    关键字synchronized的作用是实现线程间的同步.它的任务是对同步的代码加锁.一个代码块同时只能有同一个线程进行读和写操作,从而保证线程间是安全的. 线程安全的概念是:当多个线程访问某一个类(对 ...

  9. java线程学习之Sleep方法

    sleep方法是在线程中常用到的一个方法,它是一个静态方法. sleep(long millis)       在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度 ...

随机推荐

  1. CKEditor + CKFinder 实现编辑上传图片配置 (二)

    CKEditor + CKFinder 实现编辑上传图片配置 (二) 上传图片时,如果上传的图片过大,默认情况情况下回自动裁剪,代码如图 \ckfinder\config.php 目录下的配置文件co ...

  2. Struts学习之自定义拦截器

    * 所有的拦截器都需要实现Interceptor接口或者继承Interceptor接口的扩展实现类    * 要重写init().intercept().destroy()方法        * in ...

  3. 【Howie玩docker】-命令行只显示-bash-4.1#

    灵雀云上面用docker建了个centOS的实例,首个免费,正好当云主机来玩. 但是,打开有个问题,命令行不显示当前用户和路径. 只显示: -bash-4.1# 简单,配置文件不全而已. 下面对其重新 ...

  4. Visual Studio 常用快捷键总结

    删除或剪切一行:  Ctrl + X 或者 Shift+Delete格式化整个文档:  Ctrl + K + D 或者 Ctrl+E+D智能感知: Ctrl + J 或者 Alt+→折叠所有方法: C ...

  5. Oracle 数据库导入、导出

    第一步:新建一个txt文件: exp.exe jeamsluu@test file=d:\daochu.dmp log=1.log 另存为.bat格式的文件 第二步:双击运行:此时会弹出输入口令的对话 ...

  6. DateTimePicker——开源的Android日历类库

    Github托管地址:https://github.com/flavienlaurent/datetimepicker

  7. What Is Your Grade?(水,排序)

    What Is Your Grade? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  8. POJ 2115 模线性方程 ax=b(mod n)

    /* (x*c+a)%(2^k)==b →(x*c)%(2^k)==b-a 满足定理: 推论1:方程ax=b(mod n)对于未知量x有解,当且仅当gcd(a,n) | b. 推论2:方程ax=b(m ...

  9. Foundation NSMutableArray遍历,选取出符合条件的所有对象

    一.查找数组中一个元素,找到后立即返回 当遍历数组只需要返回其中一个符合条件的元素时,使用 indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, ...

  10. des 加密 iOS

    转载请注明原文出处 生成同名的Des.h文件和Des.m文件后,拷贝下方的代码可直接使用.注意在Des.m文件中将key值修改为项目所需的key.--->  #define DesKey 过程很 ...