当前位置: 移动技术网 > IT编程>开发语言>Java > Java多线程实现同时输出

Java多线程实现同时输出

2019年07月22日  | 移动技术网IT编程  | 我要评论

一道经典的面试题目:两个线程,分别打印ab,其中线程a打印a,线程b打印b,各打印10次,使之出现ababababa.. 的效果

 package com.shangshe.path;
 
 public class threadab {
 
   /**
   * @param args
   */
   public static void main(string[] args) {
     
     final print business = new print();
     
     new thread(new runnable() {
       public void run() {
         for(int i=0;i<10;i++) {
           business.print_a();
         }
       }
     }).start();
     
     new thread(new runnable() {
       public void run() {
         for(int i=0;i<10;i++) {
           business.print_b();
         }
       }
     }).start();
     
   }
 }
 class print {
   
   private boolean flag = true;
   
   public synchronized void print_a () {
     while(!flag) {
       try {
         this.wait();
       } catch (interruptedexception e) {
         // todo auto-generated catch block
         e.printstacktrace();
       }
     }
     system.out.print("a");
     flag = false;
     this.notify();
   }
   
   public synchronized void print_b () {
     while(flag) {
       try {
         this.wait();
       } catch (interruptedexception e) {
         // todo auto-generated catch block
         e.printstacktrace();
       }
     }
     system.out.print("b");
     flag = true;
     this.notify();
   }
 }

由上面的例子我们可以设计出3个线程乃至于n个线程的程序,下面给出的例子是3个线程,分别打印a,b,c 10次,使之出现abcabc.. 的效果

public class threadabc {

  /**
   * @param args
   */
  public static void main(string[] args) {
    
    final print business = new print();
    
    new thread(new runnable() {
      public void run() {
        for(int i=0;i<100;i++) {
          business.print_a();
        }
      }
    }).start();
    
    new thread(new runnable() {
      public void run() {
        for(int i=0;i<100;i++) {
          business.print_b();
        }
      }
    }).start();
    
    new thread(new runnable() {
      public void run() {
        for(int i=0;i<100;i++) {
          business.print_c();
        }
      }
    }).start();
    
  }
}
class print {
  
  private boolean should_a = true;
  private boolean should_b = false;
  private boolean should_c = false;
  
  public synchronized void print_a () {
    while(should_b || should_c) {
      try {
        this.wait();
      } catch (interruptedexception e) {
        // todo auto-generated catch block
        e.printstacktrace();
      }
    }
    system.out.print("a");
    should_a = false;
    should_b = true;
    should_c = false;
    this.notifyall();
  }
  
  public synchronized void print_b () {
    while(should_a || should_c) {
      try {
        this.wait();
      } catch (interruptedexception e) {
        // todo auto-generated catch block
        e.printstacktrace();
      }
    }
    system.out.print("b");
    should_a = false;
    should_b = false;
    should_c = true;
    this.notifyall();
  }
  
  public synchronized void print_c () {
    while(should_a || should_b) {
      try {
        this.wait();
      } catch (interruptedexception e) {
        // todo auto-generated catch block
        e.printstacktrace();
      }
    }
    system.out.print("c");
    should_a = true;
    should_b = false;
    should_c = false;
    this.notifyall();
  }
}

再一次证明了软件工程的重要性了;在多线程程序中,应该说在程序中,我们应该把那些业务逻辑代码放到同一个类中,使之高内聚,低耦合

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网