多线程之儿子买盐问题

多线程之儿子买盐问题

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

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

  问题分析:既然是面向对象编程,拿到问题是首先就要分析涉及到哪些对象。显然,该问题涉及的对象有:妈妈、儿子和盐。其中妈妈和儿子都是线程类,共享资源就是盐,所以盐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 }

 

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • cj广告联盟「建议收藏」

    cj广告联盟「建议收藏」CommissionJunction(简称CJ)是目前国外最大的综合网络广告商,拥有超过1000家赞助商,且每天都有新的公司加入,支持中文网站,是站长赚钱的第一选择。公司业务广泛,技术完善,相对于其它综合网络广告商的优点是由其每月统一付款,但正应为如此,所以要求严格。公司支持中文网站,每推荐一人获得$1.5美金。最小起付额为25美元,每月统计付款。CJ,全称Com…

    2022年9月19日
    2
  • java.text.NumberFormat使用方法

    java.text.NumberFormat使用方法

    2021年12月6日
    44
  • 判断一个数是否为素数(质数) c语言[通俗易懂]

    质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数。最小的质数是2,它也是唯一的偶数质数。原理:number只需被(2~根号下number)之间的每一个整数去除就可以了(包括根号下number这个数)。如果nummber不能被(2~根号下number)间任一整数整除,number必定是素数#include”stdio.h”#include”math.h”main(){ intnumber,i,n; printf(“请输入一个正整数:

    2022年4月7日
    52
  • 可以外链的网络相册

    可以外链的网络相册1.Yupoo简介:Yupoo已非早前的Yupoo,现在已经开始商业起来,免费账户的外链图片会被打上水印,月上传的流量为61M,外链流量为500M,通过博客认证后外链流量为1G。关于VIP的详细数据如下:http://www.yupoo.com/payment/introduce 总的来说现在的每年30元的VIP账户就是以前的免费账户。重要一点是月外链流量大于30G时即便你购买的是18…

    2022年6月29日
    33
  • java的前端还是后端_java语言是开发前端还是后端的[通俗易懂]

    java的前端还是后端_java语言是开发前端还是后端的[通俗易懂]java语言是开发前端还是后端的发布时间:2020-06-2616:01:18来源:亿速云阅读:105作者:Leahjava语言是开发前端还是后端的?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。java不是前端,是后端。Java语言是最常见的后端开发语言之一,Java语言由于自身具备构建多线程的能力,且体系结构比较中…

    2022年7月7日
    19
  • Python 股票历史数据的获取

    Python 股票历史数据的获取本文主要讨论的是pytho免费股票数据的获取及处理。国内提供股票数据的接口如sinajs,money.163.com,yahoo,它们提供的API接口不同,每家提供的数据大同小异,可以选择一家的数据来处理。

    2022年6月24日
    43

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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