首页 > 编程 > Java > 正文

Java多线程实现同时输出

2019-11-26 14:30:20
字体:
来源:转载
供稿:网友

一道经典的面试题目:两个线程,分别打印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();  }}

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表