练习题之Wait/Notify

方案一:

public class PrintABC {
  public static void main(String[] args) {
    AtomicInteger synObj = new AtomicInteger(0);
    Runnable r = new ThreadModel(synObj);
    new Thread(r,"A").start();
    new Thread(r,"B").start();
    new Thread(r,"C").start();
  }
}

public class ThreadModel implements Runnable {
 public volatile AtomicInteger ato;
  
 public ThreadModel(AtomicInteger ato) {
    this.ato = ato;
 }

 public void run() {
  for(int i=0;i<10;i++) {
    synchronized(ato) {
      if(ato.get()%3==0) {
         System.out.println("A);
         ato.set(ato.get()+1);
         ato.notifyAll();
      } else if(ato.get()%3==1) {
         System.out.println("B);
         ato.set(ato.get()+1);
         ato.notifyAll();
      } else if(ato.get()%3==2) {
         System.out.println("C);
         ato.set(ato.get()+1);
         ato.notifyAll();
      } else {
         ato.wait();
      }
    }
  }
 }
}

方案二:

public class printABC {
 
 public static void main(String [] args) {
   AtomicInteger ato = new AtomicInteger(0);
   ThreadModel modelA = new ThreadModel(ato,"A",0);
   ThreadModel modelB = new ThreadModel(ato,"B",0);
   ThreadModel modelC = new ThreadModel(ato,"C",0);
   new Thread(modelA).start();
   new Thread(modelB).start();
   new Thread(modelC).start();
 }
  
}

public class ThreadModel {
 
  private AtomicInteger ato;
  private String printChar;
  private int flag;
  private int count = 0;
  public ThreadModel(AtomicInteger ato,String printChar,int flag) {
    this.ato = ato;
    this.printChar = printChar;
    this.flag = flag;
  }
 
 public void run() {
    synchronized(ato) {
       while(true) {
          if(ato.get()%3==flag) {
             System.out.println(printChar);
             ato.set(ato.get()+1);
             ato.notifyAll();
             count++;
             if(count==10) {
                break;
              }
          }else {
             ato.wait();
          }
       }
    }
 }
 
}

 

posted @ 2016-05-17 23:10  moonandstar08  阅读(335)  评论(0编辑  收藏  举报