黑马程序员技术交流社区

标题: 进程间通信问题 [打印本页]

作者: 祁振朋    时间: 2013-3-20 15:28
标题: 进程间通信问题
本帖最后由 祁振朋 于 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()不行?

作者: 罗玉宁    时间: 2013-3-22 01:36
如果你是做线程间的通信的话,这样已经可以了。不知道你说的if()不行是什么意思?
作者: 杨杨    时间: 2013-3-22 09:12
本帖最后由 杨杨 于 2013-3-22 09:13 编辑

if 和while的区别你知道吗
if(条件1){内容1}while(条件2){内容2}
if条件1成立是执行 if内容1
while 只要满足条件2就不断的执行内容2 不断的执行
只有当条件执行一次的时候if才等价于while
作者: 谭辉    时间: 2013-3-22 13:35
应该用while,
因为if只判断了一次,
if (flag!=1)
   wait();
如果当if判断完后,执行权被其他线程夺走,并且修改了flag的值,当重新拥有执行权后就不会再判断了而是执行wait(),显然会出错,
而while就不同了,就算if判断完后,执行权被其他线程夺走,并且修改了flag的值当重新拥有执行权后,还会在判断flag的值,wait()就不会执行了.也就不会出错了
作者: 陈丽莉    时间: 2013-3-22 16:12
记得及时处理帖子哦,继续追问,或将分类改成【已解决】~




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