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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 祁振朋 中级黑马   /  2013-3-20 15:28  /  1375 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 祁振朋 于 2013-3-22 18:26 编辑

  1. <P> class NotifyDemo {

  2. public static void main(String[] args) {
  3.   final Printer p = new Printer();
  4.   
  5.   new Thread(){
  6.    public void run() {
  7.     while(true)
  8.      try{
  9.       p.print1();
  10.       Thread.sleep(500);
  11.       }
  12.      catch(Exception e)
  13.      {
  14.       e.printStackTrace();
  15.      }
  16.    }
  17.   }.start();
  18.   
  19.   new Thread(){
  20.    public void run() {
  21.     while(true)
  22.      try{
  23.       p.print2();
  24.       Thread.sleep(500);
  25.       }
  26.      catch(Exception e)
  27.      {
  28.       e.printStackTrace();
  29.      }
  30.    }
  31.   }.start();</P>
  32. <P>  new Thread(){
  33.    public void run() {
  34.     while(true)
  35.      try{
  36.       p.print3();
  37.       Thread.sleep(500);
  38.       }
  39.      catch(Exception e)
  40.      {
  41.       e.printStackTrace();
  42.      }
  43.    }
  44.   }.start();
  45. }
  46.   
  47. }</P>
  48. <P>class Printer {
  49. private int flag=1;
  50. private int i=0,j=0;
  51. public synchronized void print1()throws Exception
  52.   {
  53.   if (flag!=1)
  54.    wait();

  55.   System.out.print("传");
  56.   System.out.print("智");
  57.   System.out.print("播");
  58.   System.out.print("客");
  59.   System.out.print(flag);
  60.   System.out.print("\r\n");
  61.   flag=2;
  62.   notifyAll();</P>
  63. <P> }

  64. public void print2() throws Exception
  65.   {
  66.   synchronized (this) {
  67.    if(flag!=2)
  68.     wait();
  69.   
  70.    System.out.print("黑");
  71.    System.out.print("马");
  72.    System.out.print("程");
  73.    System.out.print("序");
  74.    System.out.print("员");
  75.    System.out.print(flag);
  76.    System.out.print("\r\n");
  77.    flag=3;
  78.    notifyAll();
  79.    
  80.   }
  81. }</P>
  82. <P> public synchronized void print3()throws Exception
  83.   {
  84.   if (flag!=3)
  85.    wait();
  86.   
  87.   
  88.   System.out.print("i");
  89.   System.out.print("t");
  90.   System.out.print("c");
  91.   System.out.print("a");
  92.   System.out.print("s");
  93.   System.out.print("t");
  94.   System.out.print(flag);
  95.   System.out.print("\r\n");
  96.   flag=1;
  97.   notifyAll();
  98.   
  99. }

  100. }</P>
复制代码
我想做进程间通信的测试,为什么用了if()不行?

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

4 个回复

倒序浏览
如果你是做线程间的通信的话,这样已经可以了。不知道你说的if()不行是什么意思?
回复 使用道具 举报
本帖最后由 杨杨 于 2013-3-22 09:13 编辑

if 和while的区别你知道吗
if(条件1){内容1}while(条件2){内容2}
if条件1成立是执行 if内容1
while 只要满足条件2就不断的执行内容2 不断的执行
只有当条件执行一次的时候if才等价于while

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
应该用while,
因为if只判断了一次,
if (flag!=1)
   wait();
如果当if判断完后,执行权被其他线程夺走,并且修改了flag的值,当重新拥有执行权后就不会再判断了而是执行wait(),显然会出错,
而while就不同了,就算if判断完后,执行权被其他线程夺走,并且修改了flag的值当重新拥有执行权后,还会在判断flag的值,wait()就不会执行了.也就不会出错了

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
记得及时处理帖子哦,继续追问,或将分类改成【已解决】~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马