A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郝勇 中级黑马   /  2013-4-12 18:58  /  1756 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郝勇 于 2013-4-13 04:19 编辑
  1. public class Test10 {
  2. public static void main(String[] args)
  3. {

  4. Salt s = new Salt();

  5. new Thread(new Mom(s)).start();
  6. new Thread(new Son(s)).start();
  7. }
  8. }
  9. class Salt{
  10. boolean flag = false;
  11. }
  12. class Mom implements Runnable
  13. {
  14. private Salt s;
  15. Mom(Salt s)
  16. {
  17. this.s = s;
  18. }
  19. public void run()
  20. {
  21. while(true){
  22. synchronized(s){
  23. if(s.flag){
  24. try{s.wait(1000);}
  25. catch(Exception e){}
  26. System.out.println("妈妈说:没盐了,儿子,买盐去!没法做饭了");
  27. s.flag = true;
  28. s.notify();
  29. }


  30. }
  31. }
  32. }
  33. }
  34. class Son implements Runnable{
  35. private Salt s;
  36. Son(Salt s)
  37. {
  38. this.s = s;
  39. }
  40. public void run()
  41. {
  42. while(true){
  43. synchronized(s){
  44. if(!s.flag)
  45. try{s.wait();}catch(Exception e){}
  46. System.out.println("好的,马上去买盐!!!");
  47. s.flag = false;
  48. s.notify();
  49. }
  50. }
  51. }
  52. }
复制代码

点评

两边发一样的帖子????!!  发表于 2013-4-12 23:07

3 个回复

倒序浏览
  1. public class Cooking {
  2.         public static void main(String[] args) {
  3.                 new Thread(new Mother()).start();
  4.         }
  5. }

  6. class Salt {
  7.         boolean flag = false;
  8. }

  9. class Mother implements Runnable {
  10.         public void run() {
  11.                 System.out.println("开始做饭了");
  12.                 System.out.println("妈妈说:\"没盐了,儿子,买盐去!\"");
  13.                 Thread son = new Thread(new Son());
  14.                 son.start();
  15.                 try {
  16.                         son.join();
  17.                 } catch (InterruptedException e) {
  18.                         e.printStackTrace();
  19.                 }
  20.                 System.out.println("盐买回来,妈妈继续做饭。");
  21.         }
  22. }

  23. class Son implements Runnable {
  24.         public void run() {
  25.                 System.out.println("儿子:\"好的,马上去买盐!\"");
  26.                 try {
  27.                         Thread.sleep(3000);
  28.                 } catch (InterruptedException e) {
  29.                         e.printStackTrace();
  30.                 }
  31.         }
  32. }
复制代码
没有太明白楼主的代码,private Salt s, s.notify();什么意思。买盐的问题可以参考一下以上代码。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
  1. /**
  2. * 模拟妈妈做饭,做饭时发现没有盐了,让儿子去买盐(假设买盐需要3分钟),只有盐买回来之后,妈妈才能继续做饭的过程。
  3. *
  4. *
  5. */
  6. public class Test10 {
  7.         public static void main(String[] args) {
  8.                 // 定义做饭的对象
  9.                 final Cook c = new Cook();
  10.                 // 定义一个妈妈做饭的线程,并启动
  11.                 new Thread(new Runnable() {
  12.                         public void run() {
  13.                                 while (true) {
  14.                                         c.makeCook();
  15.                                 }
  16.                         }
  17.                 }).start();
  18.                 // 定义一个儿子买盐的线程,并启动
  19.                 new Thread(new Runnable() {
  20.                         public void run() {
  21.                                 while (true) {
  22.                                         c.buySalt();
  23.                                 }
  24.                         }
  25.                 }).start();
  26.         }
  27. }

  28. /**
  29. * 因为妈妈儿子需要用到相同的锁对象,和相同的是否能做饭的标示对戏那个,所以把他们封装在一个类中的两个方法中。
  30. */
  31. class Cook {
  32.         // 是否能做饭的标识
  33.         private boolean canCook = false;

  34.         /**
  35.          * 妈妈做饭的方法
  36.          */
  37.         public synchronized void makeCook() {
  38.                 // 如果没有盐,就等待3分钟,唤醒儿子去买盐。
  39.                 if (!canCook) {
  40.                         System.out.println("没有盐,不能做饭...");
  41.                         System.out.println("等待买盐....");
  42.                         try {
  43.                                 this.notify();
  44.                                 Thread.sleep(1000 * 3 * 60);
  45.                                 this.wait();
  46.                         } catch (InterruptedException e) {
  47.                                 e.printStackTrace();
  48.                         }
  49.                 }
  50.                 // 能做饭了。做完之后,把变量设置回去。
  51.                 System.out.println("妈妈正在做饭。。。");
  52.                 canCook = false;
  53.         }

  54.         /**
  55.          * 儿子买盐的方法
  56.          */
  57.         public synchronized void buySalt() {
  58.                 // 如果能做饭,儿子就休息
  59.                 if (canCook) {
  60.                         try {
  61.                                 this.wait();
  62.                         } catch (InterruptedException e) {
  63.                                 e.printStackTrace();
  64.                         }
  65.                 }
  66.                 // 如果没有盐,儿子去买盐并唤醒妈妈,把能做饭设置true
  67.                 System.out.println("儿子去买盐了,");
  68.                 canCook = true;
  69.                 this.notify();
  70.         }
  71. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
已经解决了,发一样的帖子是为了让更多的人看到给帮忙解决,这个是我自己粗心,多了一对{};已经改过来了,多谢下面两位,我会参考你们的编程思路的!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马