黑马程序员技术交流社区

标题: 多线程打印ABC轮流3边,第二遍后卡死,找不出原因 [打印本页]

作者: 秦岩    时间: 2012-4-8 20:30
标题: 多线程打印ABC轮流3边,第二遍后卡死,找不出原因
  1. package cn.copy;

  2. /*
  3. * 改造以下代码, 打印出如下形式:
  4. * A 1
  5. * A 2
  6. * A 3
  7. *
  8. * B 1
  9. * B 2
  10. * B 3
  11. *
  12. * A 1
  13. * A 2
  14. * A 3
  15. *
  16. * B 1
  17. * B 2
  18. * B 3
  19. *
  20. * A 1
  21. * A 2
  22. * A 3
  23. *
  24. * B 1
  25. * B 2
  26. * B 3
  27. */

  28. public class PrintTest {

  29.         public static void main(String[] args) {
  30.                 final Printer printer = new Printer();
  31.                
  32.                 new Thread(){
  33.                         public void run() {
  34.                                 for (int i = 0; i < 3; i++)
  35.                                         printer.print1();
  36.                         };
  37.                 }.start();
  38.                
  39.                 new Thread(){
  40.                         public void run() {
  41.                                 for (int i = 0; i < 3; i++)
  42.                                         printer.print2();
  43.                         };
  44.                 }.start();
  45.                
  46.                 new Thread(){
  47.                         public void run() {
  48.                                 for (int i = 0; i < 3; i++)
  49.                                         printer.print3();
  50.                         };
  51.                 }.start();
  52.                
  53.         }

  54. }

  55. class Printer {
  56.         private int turn = 3;                // 目前该轮到哪个方法了

  57.         public synchronized void print1() {
  58.                 if (turn != 3){ // 如果不该1, 等待
  59.                         try {
  60.                                 this.wait();
  61.                         } catch (InterruptedException e) {
  62.                                 // TODO Auto-generated catch block
  63.                                 e.printStackTrace();
  64.                         }
  65.                 }
  66.                 if (turn == 3){
  67.                         for (int i = 1; i <= 3; i++)
  68.                                 System.out.println("A " + i);
  69.                         System.out.println();
  70.                        
  71.                         turn = 1;// 1执行后该2
  72.                         this.notifyAll();// 唤醒

  73.                 }
  74.         }

  75.         public synchronized void print2() {
  76.                 if (turn != 1){// 如果不该2, 等待
  77.                         try {
  78.                                 this.wait();
  79.                         } catch (InterruptedException e) {
  80.                                 // TODO Auto-generated catch block
  81.                                 e.printStackTrace();
  82.                         }
  83.                 }
  84.                 if (turn == 1) {
  85.                         for (int i = 1; i <= 3; i++)
  86.                                 System.out.println("B " + i);
  87.                         System.out.println();
  88.                        
  89.                         turn = 2;// 2执行后该1
  90.                         this.notifyAll();// 唤醒
  91.                 }
  92.         }
  93.        
  94.         public synchronized void print3() {
  95.                 if (turn != 2){
  96.                         try {
  97.                                 this.wait();
  98.                         } catch (InterruptedException e) {
  99.                                 // TODO Auto-generated catch block
  100.                                 e.printStackTrace();
  101.                         }
  102.                 }
  103.                 if (turn == 2) {
  104.                         for (int i = 1; i <= 3; i++)
  105.                                 System.out.println("C " + i);
  106.                         System.out.println();
  107.                         turn = 3;
  108.                         this.notifyAll();
  109.                 }       
  110.                
  111.         }

  112. }
复制代码

作者: pray    时间: 2014-4-26 06:29
楼主出门来财,儿孙满堂!




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