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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 尹善波 中级黑马   /  2012-7-2 19:15  /  1742 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 菠菜(yinshi) 于 2012-7-2 19:17 编辑

回答别人问题时,搞得自己有了不一样的疑问?有点晕,希望得到解决
  1. public class Exercise31 {
  2.          public static void main(String[] args) {
  3.                  final Printer p=new Printer();
  4.                  new Thread(){
  5.                          public void run()
  6.                          {
  7.                                  for(int i=0;i<5;i++)
  8.                                          p.print1();
  9.                                  
  10.                          }
  11.                         
  12.                  }.start();
  13.                  new Thread(){
  14.                          public void run()
  15.                          {
  16.                                  for(int i=0;i<5;i++)
  17.                                          p.print2();
  18.                                  
  19.                          }
  20.                         
  21.                  }.start();

  22.         }

  23. }
  24. class Printer
  25. {
  26.          private int turn=1;
  27.          public synchronized void print1()
  28.         {
  29.                  if(turn!=1)
  30.                          try {
  31.                                  this.wait();
  32.                          } catch (InterruptedException e) {
  33.                                  
  34.                                  e.printStackTrace();
  35.                          }
  36.                   else
  37.                          System.out.println(Thread.currentThread().getName()+"A");
  38.                 turn=2;
  39.                  this.notify();
  40.          }
  41.          public synchronized void print2()
  42.          {
  43.                 if(turn!=2)
  44.                          try {
  45.                                  this.wait();
  46.                          } catch (InterruptedException e) {
  47.                                  
  48.                                  e.printStackTrace();
  49.                          }
  50.                   else//这里的加上else后为什么只能每个线程运行一次?如果去掉则可以正常输出。但是如果去掉的话if语句的范围是什么?是不是在try前和notify()后加上大括号人范围?如果是的话为什么没有输出?<font color="red">求详解</font>,上面的那个if语句的问题也是这,就不写了
  51.                      System.out.println(Thread.currentThread().getName()+"B");
  52.                  turn=1;
  53.                  this.notify();
  54.          }
  55. }
复制代码

2 个回复

正序浏览
建议LZ写代码时,把括号对应好。这样会减少错误发生的可能性.
public class Exercise31 {
public static void main(String[] args) {
  final Printer p = new Printer();
  new Thread() {
   public void run() {
    for (int i = 0; i < 5; i++)
     p.print1();
   }
  }.start();
  new Thread() {
   public void run() {
    for (int i = 0; i < 5; i++)
     p.print2();
   }
  }.start();
}
}
class Printer {
private int turn = 1;
public synchronized void print1() {
  if (turn != 1) {
   try {
    this.wait();
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
  else{
   System.out.println(Thread.currentThread().getName() + "A");
   turn = 2;
  }
  this.notify();
}
public synchronized void print2() {
  if (turn != 2)
  {
   try {
    this.wait();
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
  else{
   System.out.println(Thread.currentThread().getName() + "B");
   turn = 1;
  }
  this.notify();
}
}

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 11期最后一分送给你!加油啊!亲!!.

查看全部评分

回复 使用道具 举报
public synchronized void print2()

44.         {

45.                if(turn!=2)

46.                         try {

47.                                 this.wait();

48.                         } catch (InterruptedException e) {

49.                                 

50.                                 e.printStackTrace();

51.                         }

52.                  else//这里的加上else后为什么只能每个线程运行一次?如果去掉则可以正常输出。但是如果去掉的话if语句的范围是什么?是不是在try前和notify()后加上大括号人范围?如果是的话为什么没有输出?<font color="red">求详解</font>,上面的那个if语句的问题也是这,就不写了
                 //有两个线程,假设分别为A和B线程,假如A先执行,执行完后,标记turn的值改变,A线程就处于了等待状态,
                   这时B线程执行,B线程执行完,turn的值有改变了,这时A又开始执行,但是A是接着等待状态这个位置执行的,
                   如果不去掉else,则会跳过打印语句去执行改变turn值的操作,同理B线程也是这样

53.                     System.out.println(Thread.currentThread().getName()+"B");

54.                 turn=1;

55.                 this.notify();

56.         }

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马