黑马程序员技术交流社区

标题: 求助Java线程同步唤醒 [打印本页]

作者: 宁超    时间: 2011-10-12 11:17
标题: 求助Java线程同步唤醒
本帖最后由 宁超 于 2011-10-12 11:45 编辑
  1. class Res {
  2.         private String name;
  3.         private String sex;
  4.         private boolean flag = false;
  5.         public synchronized void Set(String name, String sex) {
  6.                 if (flag) {
  7.                         try {
  8.                                 this.wait();
  9.                         } catch (Exception e) {
  10.                         }
  11.                         this.name = name;
  12.                         this.sex = sex;
  13.                         flag = true;
  14.                         this.notify();
  15.                 }
  16.         }

  17.         public synchronized void Out() {
  18.                 if (!flag)
  19.                         try {
  20.                                 this.wait();
  21.                         } catch (Exception e) {
  22.                         }
  23.                 System.out.println(name + "......." + sex);
  24.                 flag = false;
  25.                 this.notify();
  26.         }
  27. }

  28. class Input implements Runnable {
  29.         private Res r;
  30.         Input(Res r) {
  31.                 this.r = r;
  32.         }
  33.         public void run() {
  34.                 int x = 0;
  35.                 while (true) {
  36.                         if (x == 0)
  37.                                 r.Set("mike", "man");
  38.                         else
  39.                                 r.Set("小红", "女");
  40.                         x = (x + 1) % 2;

  41.                 }

  42.         }
  43. }

  44. class Output implements Runnable {
  45.         private Res r;

  46.         Output(Res r) {
  47.                 this.r = r;
  48.         }

  49.         public void run() {
  50.                 while (true) {
  51.                         r.Out();
  52.                 }

  53.         }
  54. }

  55. public class ThreadWaitDemo {
  56.         public static void main(String args[]) {
  57.                 Res r = new Res();
  58.                 new Thread(new Input(r)).start();
  59.                 new Thread(new Output(r)).start();
  60.         }

  61. }
复制代码
看完比老师后视频写的。但是执行不出来。谁帮看下。
作者: 许冉    时间: 2011-10-12 11:40
new Thread(new Input(r)).start();
new Thread(new Input(r)).start();

弄了两个Input,没有Output
作者: 宁超    时间: 2011-10-12 11:43
我改了还是的。。
作者: 许冉    时间: 2011-10-12 11:59
本帖最后由 xuan 于 2011-10-12 12:08 编辑

上回错了

public synchronized void Set(String name, String sex) {
                while (flag) {      //最好换成while
                        try {
                                this.wait();
                        } catch (Exception e) {
                        }}             //  while结束在这
                        this.name = name;
                        this.sex = sex;
                        flag = true;       //这里应该是true,我搞错了
                        this.notify();
               
                                System.out.println("--");
        }

        public synchronized void Out() {
                while (!flag){
                        try {
                                this.wait();
                        } catch (Exception e) {
                        }}
                System.out.println(name + "......." + sex);
                flag = false;
                this.notify();
        }

作者: 许冉    时间: 2011-10-12 12:11
不过你原来的代码只要改一处
if (flag) {
                        try {
                                this.wait();
                        } catch (Exception e) {
                        } }  //把if 的结束括号放这里
                        this.name = name;
                        this.sex = sex;
                        flag = true;
                        this.notify();
              
作者: ruanjianxzh    时间: 2011-10-12 12:22
Input中d的r只是局部的,main方法中得r的属性一直没有变
作者: 宁超    时间: 2011-10-12 12:32
找到问题了。
  1. if (flag) {

  2.                         try {

  3.                                 this.wait();

  4.                         } catch (Exception e) {

  5.                         }

  6.                         this.name = name;

  7.                         this.sex = sex;

  8.                         flag = true;

  9.                         this.notify();

  10.                 }

复制代码
if 那多了层大括号
作者: 许冉    时间: 2011-10-12 13:11
宁超 发表于 2011-10-12 12:32
找到问题了。if 那多了层大括号

恩,if管的太宽了
作者: 郭敏    时间: 2011-10-12 13:45
Res 中Set方法。  线程在调有该方法时先判读flag的值, 如果为真才运行,为假则跳过! 初始值为 false, 即使Input 得到CPU执行权,也无法将值设置给Res类中的name,sex。而在Out 方法中。先判读 !flag ,如为真,则线程wait().




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2