多线程之儿子买盐问题

简介:

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

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

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

相关文章
|
3月前
专升本一题,读结果
【10月更文挑战第16天】专升本一题,读结果。
26 5
|
7月前
|
数据安全/隐私保护
【洛谷 P1928】外星密码 题解(递归+字符串)
外星密码挑战涉及解压缩由重复子串压缩的字符串,如`[3FUN]`代表`FUNFUNFUN`。输入是一行压缩过的字符串,输出是解压缩的结果。代码使用递归方法,遇到`[`读取重复次数并解压下一层,遇到`]`返回当前层结果,否则直接添加字符。样例输入`AC[3FUN]`输出`ACFUNFUNFUN`。处理的数据限制为解压后长度在20000内,最多十重压缩。
109 0
|
5月前
|
存储 算法
读《趣学算法》:重开算法之门,神奇的兔子数列(斐波那契数列)
本文通过《趣学算法》中的斐波那契数列问题,探讨了算法的递归实现、时间复杂度分析,并展示了如何通过迭代和优化存储空间来改进算法,最终将时间复杂度从指数级降低到线性级,并将空间复杂度从线性级降低到常数级。
111 0
读《趣学算法》:重开算法之门,神奇的兔子数列(斐波那契数列)
|
8月前
|
存储 索引
线性表你还不知道原理?给老王整的明明白白
线性表你还不知道原理?给老王整的明明白白
96 0
|
算法 测试技术 C#
一题三解(暴力、二分查找算法、单指针):鸡蛋掉落
一题三解(暴力、二分查找算法、单指针):鸡蛋掉落
|
API
代码随想录 Day6 哈希 LeetcodeT454 四数之和II T383赎金信 T15 三数之和 T18 四数之和
代码随想录 Day6 哈希 LeetcodeT454 四数之和II T383赎金信 T15 三数之和 T18 四数之和
40 0
876. 链表的中间结点【我亦无他唯手熟尔】
876. 链表的中间结点【我亦无他唯手熟尔】
97 0
|
存储 算法 测试技术
【动态规划】俄罗斯信封套娃问题,最长回文子序列
要求的是回文子序列,那这里的集合必然和子序列有关,分析回文的属性.
111 0
|
算法
蓝桥杯 算法 猴子吃包子、 查找整数
蓝桥杯 算法 猴子吃包子、 查找整数
131 0