多线程之儿子买盐问题

多线程之儿子买盐问题

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

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

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


相关推荐

  • 使用python快速开发桌面小工具

    使用python快速开发桌面小工具参考链接WelcometoPython.orgExtendingandEmbeddingthePythonInterpreter—Python3.7.3documentation起因更重要在日常开发中,总需要一些普通的小工具。小工具嘛,要得急,写得也急,总有很多不完善的问题,频繁修改成了一个较大的问题。比如之前用c#写了一个将excel表自动转成csv文本的工具,…

    2022年5月20日
    45
  • oracle修改数据库用户名密码,怎样修改oracle数据库的用户名密码[通俗易懂]

    oracle修改数据库用户名密码,怎样修改oracle数据库的用户名密码[通俗易懂]对于不经常使用数据库的同学们来说,忘记用户名密码是很常见的一件事。下面就让学习啦小编给大家说说怎样修改oracle数据库的用户名密码吧。修改oracle数据库用户名密码的方法进入cmd命令界面(快捷键是win+R)。修改管理员用户密码(一):在命令界面输入sqlplus“/assysdba”即可以管理员身份链接成功。修改管理员用户密码(二):在SQL命令界面输入alterusersyste…

    2022年7月28日
    3
  • pycharm整理代码格式_pycharm怎么变成黑色

    pycharm整理代码格式_pycharm怎么变成黑色black简介自动的代码格式化工具,兼容pep8,项目地址为:官方给出的简介:BlackistheuncompromisingPythoncodeformatter.Byusingit,youagreetocedecontroloverminutiaeofhand-formatting.Inreturn,Blackgivesyouspeed,determinism,andfreedomfrompycodestylenaggingabo

    2025年7月30日
    4
  • Matlab GUI界面设计

    Matlab GUI界面设计摘要:本篇博文基于MATLAB2014a进行GUI设计。

    2022年4月27日
    45
  • 线程的用户态和内核态_缺页发生在用户态还是内核态

    线程的用户态和内核态_缺页发生在用户态还是内核态(1)用户态和内核态的概念?—>内核态:CPU可以访问内存所有数据,包括外围设备,例如硬盘,网卡.CPU也可以将自己从一个程序切换到另一个程序—>用户态:只能受限的访问内存,且不允许访问外围设备.占用CPU的能力被剥夺,CPU资源可以被其他程序获取(2)为什么需要用户态和内核态?—>由于需要限制不同的程序之间的访问能力,防止他们获取别的程序的内存数据,…

    2022年9月18日
    2
  • chmod 755

    chmod 755转载自 https://www.cnblogs.com/shangzekai/p/5822907.html chmod是Linux下设置文件权限的命令,后面的数字表示不同用户或用户组的权限。一般是三个数字:第一个数字表示文件所有者的权限第二个数字表示与文件所有者同属一个用户组的其他用户的权限第三个数字表示其它用户组的权限。权限分为三种:读(r=4),写(w=2),执行(…

    2022年7月16日
    14

发表回复

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

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