黑马程序员技术交流社区

标题: 等待唤醒机制的问题 [打印本页]

作者: 刘俊佳    时间: 2012-8-16 09:29
标题: 等待唤醒机制的问题
以下是代码:
  1. package thread2;

  2. class Res {
  3. private String name;
  4. private String sex;
  5. private boolean flag = false;

  6. public synchronized void set(String name, String sex) {
  7. if (flag)
  8. try {
  9. this.wait();
  10. } catch (InterruptedException e) {
  11. e.printStackTrace();
  12. }
  13. this.name = name;
  14. this.sex = sex;
  15. flag = true;
  16. this.notify();
  17. }

  18. public synchronized void out() {
  19. if(!flag)
  20. try {
  21. this.wait();
  22. } catch (InterruptedException e) {
  23. e.printStackTrace();
  24. flag=false;
  25. this.notify();
  26. }

  27. System.out.println((name + "........." + sex));
  28. }
  29. }
复制代码
  1. package thread2;

  2. public class Input implements Runnable {
  3. private Res r;// 建立一个引用
  4. Input(Res r) {
  5. this.r = r;
  6. }

  7. public void run() {
  8. int x = 0;
  9. while (true) {
  10. if (x == 0)
  11. r.set("milk", "man");
  12. else
  13. r.set("丽丽", "女女女女女女女女女");
  14. x = (x + 1) % 2;

  15. }

  16. }
  17. }
复制代码
  1. package thread2;

  2. public class Output implements Runnable {
  3. private Res r;

  4. Output(Res r) {
  5. this.r = r;
  6. }

  7. public void run() {
  8. while(true){
  9. r.out();
  10. }
  11. }
  12. }
复制代码
  1. package thread2;


  2. public class InputOutputDemo
  3. {
  4. public static void main(String[] args)
  5. {
  6. Res r=new Res();

  7. new Thread(new Input(r)).start();
  8. new Thread(new Output(r)).start();



  9. }

  10. }
复制代码
以下是打印结果,打印的全部都是这样的,不应该是交替打印吗?如打印完milk....man后再打印丽丽......女女女女女女?:
milk.........man
milk.........man
milk.........man
milk.........man
milk.........man
milk.........man





作者: 官文昌    时间: 2012-8-16 10:22
package thread2;

class Res {
private String name;
private String sex;
private boolean flag = false;

public synchronized void set(String name, String sex) {
if (flag)
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
this.name = name;
this.sex = sex;
flag = true;
this.notify();
}

public synchronized void out() {
if(!flag)
try {
this.wait();
} catch (InterruptedException e)
{
     e.printStackTrace();
  //   flag=false;
   //  this.notify();//写代码不够仔细啊,咋能把这两句代码放在catch()里面啊。

}
     flag=false;
     this.notify();

System.out.println((name + "........." + sex));
}
}
作者: 刘俊佳    时间: 2012-8-29 08:45
问题已解决,谢谢




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