zoukankan      html  css  js  c++  java
  • 多线程之儿子买盐问题

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

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

      问题分析:既然是面向对象编程,拿到问题是首先就要分析涉及到哪些对象。显然,该问题涉及的对象有:妈妈、儿子和盐。其中妈妈和儿子都是线程类,共享资源就是盐,所以盐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 }
    我喜欢,驾驭着代码在风驰电掣中创造完美!我喜欢,操纵着代码在随必所欲中体验生活!我喜欢,书写着代码在时代浪潮中完成经典!每一段新的代码在我手中诞生对我来说就象观看刹那花开的感动!
  • 相关阅读:
    iOS开发系列--通知与消息机制(转)
    iOS Storyboard全解析(转)
    在IOS代码中使用UNIX命令
    如何用代码实现iPhone手机软件注销和手机重启
    ios多线程开发 GCD常见用法
    ios多线程开发 GCD的基本使用
    ios错误码:NSError对象.code
    iOS9 HTTP请求失败
    (转)空指针和野指针
    (转)ARC指南
  • 原文地址:https://www.cnblogs.com/liuling/p/salt.html
Copyright © 2011-2022 走看看