多线程之儿子买盐问题

多线程之儿子买盐问题

  刚刚看到了一关于多线程的面试题目,就试着写了一下。

  题目: 模拟妈妈做饭,做饭时发现没有盐了,让儿子去买盐   。只有盐买回来之后,妈妈才能继续做饭的过程。

  问题分析:既然是面向对象编程,拿到问题是首先就要分析涉及到哪些对象。显然,该问题涉及的对象有:妈妈、儿子和盐。其中妈妈和儿子都是线程类,共享资源就是盐,所以盐Salt类的方法都要设置为同步方法。具体代码如下:

 1 package com.sync;  2 /**  3  * 题目: 模拟妈妈做饭,做饭时发现没有盐了,让儿子去买盐  4  * 只有盐买回来之后,妈妈才能继续做饭的过程。  5  * @author Administrator  6  *  7 */  8  9 // 10 class Salt{ 11 private int saltNum=0; //盐的数量,假设开始没有盐 12 13 //煮菜需要食用盐,假设煮一个菜需要10克盐 14 public synchronized int subSalt(){ 15 while(saltNum<=0){ //盐没有了,则需要等待 16 System.out.println("盐不够了,等待中....."); 17 try { 18 this.wait(); 19 } catch (InterruptedException e) { 20  e.printStackTrace(); 21  } 22  } 23  notify(); 24 saltNum = saltNum - 10; 25 System.out.println("妈妈煮菜使用了10克盐!剩余"+saltNum+"克盐!"); 26 return saltNum; 27  } 28 //买盐,每次买saltNum克盐 29 public synchronized void addSalt(int num){ 30 while(saltNum>=10){ //还有盐,暂时不需要买 31 try { 32 this.wait(); 33 } catch (InterruptedException e) { 34  e.printStackTrace(); 35  } 36  } 37 try { //假设买盐需要10秒钟 38 Thread.sleep(10000); 39 } catch (InterruptedException e) { 40  e.printStackTrace(); 41  } 42 saltNum = saltNum + num; 43 System.out.println("儿子买回来100克盐!"); 44 notify();//买完盐回来后,唤醒正在等待的母亲继续煮菜 45  } 46 } 47 48 //母亲 49 class Mother implements Runnable{ 50 private Salt salt; 51 public Mother(Salt salt) { 52 this.salt = salt; 53  } 54 public void run() { 55 while(true){ 56  salt.subSalt(); 57 try { 58 Thread.sleep(2000); 59 } catch (InterruptedException e) { 60  e.printStackTrace(); 61  } 62  } 63  } 64 65 } 66 67 //儿子 68 class Son implements Runnable{ 69 private Salt salt; 70 public Son(Salt salt) { 71 this.salt = salt; 72  } 73 public void run() { 74 while(true){ 75 try { 76 Thread.sleep(3000); 77 } catch (InterruptedException e) { 78  e.printStackTrace(); 79  } 80 salt.addSalt(100); 81  } 82  } 83 84 } 85 86 public class SaltAndCook { 87 88 public static void main(String[] args) { 89 Salt salt = new Salt(); 90 Mother m = new Mother(salt); 91 Son son = new Son(salt); 92 new Thread(m).start(); 93 new Thread(son).start(); 94  } 95 96 }

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/110155.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Delphi 2010下载+完美激活成功教程「建议收藏」

    Delphi 2010下载+完美激活成功教程「建议收藏」点击链接进入http://altd.embarcadero.com/download/RADStudio2010/delphicbuilder_2010_3615_win.isoRADStudio/

  • 【OpenCV入门教程之九】 非线性滤波专场:中值滤波、双边滤波[通俗易懂]

    正如我们上一篇文章中讲到的,线性滤波可以实现很多种不同的图像变换。然而非线性滤波,如中值滤波器和双边滤波器,有时可以达到更好的实现效果。邻域算子的其他一些例子还有对二值图像进行操作的形态学算子,用于计算距离变换和寻找连通量的半全局算子。先上一张截图:一、理论与概念讲解——从现象到本质1.1非线性滤波概述之前的那篇文章里,我们所考虑的滤波器都是线性的,即两个信号之和的响应和他们各自响应之和相等。换句话说,每个像素的输出值是一些输入像素的加权和,线性滤波器易于构造,并且易于从频率响应角度来进行分

  • 哈佛幸福课笔记上篇「建议收藏」

    哈佛幸福课笔记上篇「建议收藏」改变一生的课:哈佛幸福课笔记上篇第1课什么是积极心理学?第2课为什么要学习积极心理学?第3课幸福是一种随机现象吗?第4课积极的环境能改变人第5课环境的力量第6课乐观主义第7课逆境还是机遇?第8课感激链接:哈佛大学公开课:幸福课.《哈佛幸福课》是改变我生活最大的一项事物,没有之一。我学习了5遍幸福课,并且用过去6年的时间去尝试它践行它,感觉完全改变了我的生活。第1课什么是积极心理学?1.享受安静2.这门课不光是传授信息,而且关于如何变形。重要的不仅仅是获得了什么信息,还是何形状

  • 向navicat中导入数据库时出现错误_plsql执行sql文件

    向navicat中导入数据库时出现错误_plsql执行sql文件在Navicat导出的 或者别的sql文件,在使用Navicat导入时候 出现异常失败报错问题。搜索了很多资料查看,发现是没有解决掉的。最后无意间想起使用 MySql 直接使用命令导入尝试,发现可行的简单粗暴,直接打开你的MySql 登录以后 选择 要导入的数据库use 数据库名称;source 文件的绝对路径;完事 ,坐等~…

  • 联手中信银行 物品互赠平台宣布“不卖只送”「建议收藏」

    联手中信银行 物品互赠平台宣布“不卖只送”「建议收藏」联手中信银行 物品互赠平台宣布“不卖只送”

  • Wol 网络远程唤醒技术,通过TP-LINK路由器远程一键开启电脑

    Wol 网络远程唤醒技术,通过TP-LINK路由器远程一键开启电脑文章目录Wol网络远程唤醒技术,通过TP-LINK路由器远程一键开启电脑1、远程唤醒简介2、需要以下唤醒条件3、环境和准备工作4、配置路由器,让路由器接收你的远程开机命令5、测试配置的网络是否能够正常收到开机信号6、装个teamviewer,开机自启动,实现远程开机和远程控制Wol网络远程唤醒技术,通过TP-LINK路由器远程一键开启电脑1、远程唤醒简介远程唤醒技术(WOL,Wake-…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号