黑马程序员技术交流社区

标题: 多线程通信问题 [打印本页]

作者: 吃阁子的猫    时间: 2013-9-9 14:29
标题: 多线程通信问题
本帖最后由 吃阁子的猫 于 2013-9-13 14:20 编辑

class Print{
private int flat = 1;
public synchronized void print1() throws Exception{
  while (flat!=1) {
   wait();
  }
  System.out.print("传");
  System.out.print("智");
  System.out.print("播");
  System.out.print("客");
  System.out.println();
  notifyAll();
  flat = 2;
}
public synchronized void print2() throws Exception{
  while (flat!=2) {              //即使再判断,也是让本线程等待,其他2个都被唤醒,不也是随机执行一个线程吗,与用 if 判断有什么区别呢?
   wait();
  }
  System.out.print("黑");
  System.out.print("马");
  System.out.print("程");
  System.out.print("序");
  System.out.print("员");
  System.out.println();
  notifyAll();
  flat = 3;
}
public synchronized void print3() throws Exception{
  while (flat!=3) {
   wait();
  }
  System.out.print("c");
  System.out.print("s");
  System.out.print("d");
  System.out.print("n");
  System.out.println();
  notifyAll();
  flat = 1;
}
}
作者: mo﹎雲℡    时间: 2013-9-9 14:57
对于你的问题:
while (flat!=2) {              //即使再判断,也是让本线程等待,其他2个都被唤醒,不也是随机执行一个线程吗,与用 if 判断有什么区别呢?
   wait();
  }
while循环:如果条件满足,就执行,不满足就一直循环判断。
if()判断语句,当调的时候只执行一次,不管条件不满足或者满足。
这下明白了吗?
作者: 吃阁子的猫    时间: 2013-9-9 15:03
mo﹎雲℡ 发表于 2013-9-9 14:57
对于你的问题:
while (flat!=2) {              //即使再判断,也是让本线程等待,其他2个都被唤醒,不也是随 ...

不明白不明白
作者: 陶智第    时间: 2013-9-9 22:57
使用if语句时
    wait();语句只会执行一次,而执行一次程序有错也可能不会暴露出来
但使用while语句时
    wait()语句会被多次执行,在执行的过程中如果程序有错会充分的暴露出来。这样就可以保证线程的安全性。
作者: 吃阁子的猫    时间: 2013-9-9 23:17
陶智第 发表于 2013-9-9 22:57
使用if语句时
    wait();语句只会执行一次,而执行一次程序有错也可能不会暴露出来
但使用while语句时

是啊,这样不是就让本线程等待了,但是可能会切到其他任意2条线程上啊,但是结果是它确实是按顺序执行的
作者: 王广亚    时间: 2013-9-10 22:39
麻烦你把完整的代码拉上来。这样的话也不知道你是几个线程,怎么调用的。
作者: 陶智第    时间: 2013-9-11 07:48
这个程序好像有点问题
同步是指同一时间段只有一个线程在执行
而这个程序当flat为1时,有两个方法可供选择
也就是说,如果多个线程进入的话,可能有多个线程在同一段时段中执行,那么它们就不可能使用同一个锁。而这违背了同步的原理




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