多线程之儿子买盐问题

多线程之儿子买盐问题

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

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

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


相关推荐

  • 我的世界如何TP坐标_我的世界设置坐标

    我的世界如何TP坐标_我的世界设置坐标我的世界游戏中,/tp玩家id,开启了作弊模式与朋友联机时可以使用,作用是传送到该玩家身边。/tp玩家id将该玩家传送到x,y,z这个坐标处,需要有作弊模式权限。单机的tp指令有:/tp玩家id(开启了作弊模式与朋友联机时可以使用,作用是传送到该玩家身边)。/tp玩家id(将该玩家传送到x,y,z这个坐标处,需要有作弊模式权限)。也可以利用命令方块:/give玩家idminecr…

  • vue 使用数组splice方法失效,且总是删除最后一项的解决办法。[通俗易懂]

    vue 使用数组splice方法失效,且总是删除最后一项的解决办法。[通俗易懂]今天在写项目的时候,遇到一个很简单的需求,下图,点击添加标签,左边出现一个可以输入的标签,点击删除按钮,就能删除当前标签,很简单的需求,我却搞了一个多小时(哎…新手愚笨啊)一看到这个我的思路就是点击添加标签,把新增的节点push到自己定义的数组里,然后渲染出来,点击删除按钮,用splice方法从数组中删除掉当前的节点(很简单,很明确的思路嘛,但是却事与愿违) <div…

  • 离散均匀分布的期望和方差(均值和方差的性质)

    总结一下概统用到的各种分布,以及其期望和方差。

  • 公有云和私有云的区别有哪些

    公有云和私有云的区别有哪些近年来,云服务已经走进千百家企业,成为公司业务不可分割的一部分。作为公司管理层,我们需要使用云服务,需要对企业所使用的云服务产品做出选择,但大多数人不是科班出现,很多时候,概念都理解不了,更别提决策了。公有云、私有云、混合云,这几个概念,在企业使用云服务时,最为常见,下面我们就一起来理解一下它们,知道它们有什么区别,方便日后根据企业的实际运营状况,选择合适的云服务。公有云云计算提出的愿景,是想让企业像使用水电那样,使用IT服务。国家建立水厂、发电厂,集中提供水电,企业不再需要挖水..

  • PLSQL Developer简单使用教程[通俗易懂]

    PLSQL Developer简单使用教程[通俗易懂]PLSQLDeveloper是Oracle数据库开发工具,很牛也很好用,PLSQLDeveloper功能很强大,可以做为集成调试器,有SQL窗口,命令窗口,对象浏览器和性能优化等功能,下面简单的介绍一下如何使用PLSQLDeveloper工具,新手教程。  首先确保有oracle数据库或者有oracle服务器,然后才能使用PLSQLDeveloper连接数据库。启动P

  • mysql实现类似rownumber()的效果

    mysql实现类似rownumber()的效果–Createtesttablecreatetabletmp_test(empidint,deptidint,salarydecimal(10,2));–Inserttestdatainsertintotmp_testvalues(1,10,5500.00),(2,10,4500.00),(3,20,1900.00),(4,20,

发表回复

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

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