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 j简单邮件过滤
select min(call_log), a.mail_subject from (select mail_to,mail_subject from dw_user_deviler_201408 w ...
- 块对象block小结
blcok的形式 ^(参数列){主体} block作为返回值
- $.ajax传递字符串到后台,后台返回json对象
var mall = { MallID: $("#createId").val().trim(), MallName: $("#createName").val ...
- 浅谈SpringMVC(二)
一.SpringMVC的拦截器 1.写类implements HandlerInterceptor public class MyMvcInterceptor implements HandlerIn ...
- 一个人的旅行(用小技巧转化为dijkstra算法)
注意: 1:因为两点之间可能有多条路,所以更新路径长度的时候做一次判断 if(time < mat[a][b]) mat[a][b] = mat[b][a] = time; 2:因为主函数中的数 ...
- hdu4741
2013年两场网络赛已经过了,之前的现场赛拿了多次铜牌,而这两场网络赛我们都表现得这么水,不由得感慨起来,ACM竞赛生涯就要画上句号了,甚至整个学习生涯中这种纯学术的竞赛都要完了.这两场网络表现得不好 ...
- LineCalc,一个基于Lex&Yacc的简单行计算工具
LineCalc是基于Lex&Yacc的一个简单的行计算工具,支持常见的运算符和部分POSIX中定义于math.h中的数学函数:同时,LineCalc还提供了一个简单的错误处理模块,能检测公式 ...
- poj 3487 稳定婚姻
/** 稳定婚姻:男生不停的求婚,女生不停地拒绝 **/ #include <iostream> #include <queue> #include <cstdio> ...
- RabbitMQ(2)
上一次安装了RabbitMQ并成功创建了vhost和user,可是生产和消费的过程还没有完毕.这次主要调了一下这个过程. 上次基本的问题是没有实现过程代码的编写保存,事实上也就是Python程序,这两 ...
- os基础
命令:指计算机用户要求计算机系统为其工作的指示: 命令的表示形式: 1.字符形式: 2.菜单形式: 3.图形形式: 命令的使用方式:1. 脱机使用方式 off_line 2.联机使用方式 ...