Java多线程实现同时输出

 更新时间:2016年03月13日 09:03:23   投稿:hebedich  
这篇文章主要介绍了Java多线程实现同时打印的相关资料,需要的朋友可以参考下

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

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

相关文章

  • Java表单重复提交的避免方法

    Java表单重复提交的避免方法

    如何避免表单重复提交,这篇文章就为大家详细介绍了Java表单重复提交的避免方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • 深入学习springboot线程池的使用和扩展

    深入学习springboot线程池的使用和扩展

    这篇文章主要介绍了深入学习springboot线程池的使用和扩展,springboot框架提供了@Async注解,帮助我们更方便的将业务逻辑提交到线程池中异步执行,需要的朋友可以参考下
    2019-06-06
  • MyBatisPlus 大数据量查询慢的问题解决

    MyBatisPlus 大数据量查询慢的问题解决

    本文主要介绍了MyBatis Plus 解决大数据量查询慢问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • SpringBoot集成Jpa对数据进行排序、分页、条件查询和过滤操作

    SpringBoot集成Jpa对数据进行排序、分页、条件查询和过滤操作

    这篇文章主要介绍了SpringBoot集成Jpa对数据进行排序、分页、条件查询和过滤操作,主要使用Jpa连接数据库对数据进行排序、分页、条件查询和过滤操作,需要的朋友可以参考下
    2023-05-05
  • idea统计代码行数Statistic的步骤详解

    idea统计代码行数Statistic的步骤详解

    这篇文章主要介绍了idea统计代码行数Statistic的步骤详解,本文通过使用Statistic插件操作的,通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Java19新特性中结构化并发的使用

    Java19新特性中结构化并发的使用

    Java19在并发编程领域引入了一个全新的概念:结构化并发,这一特性旨在简化并发任务的管理,提升多线程程序的可维护性和安全性,使其生命周期和控制流更加有序和明确,感兴趣的可以了解一下
    2024-09-09
  • 基于mybatis中<include>标签的作用说明

    基于mybatis中<include>标签的作用说明

    这篇文章主要介绍了基于mybatis中<include>标签的作用说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • java面试题——详解HashMap和Hashtable 的区别

    java面试题——详解HashMap和Hashtable 的区别

    本篇文章主要介绍了java中HashMap和Hashtable的区别,具有一定的参考价值,有需要的可以了解一下。
    2016-11-11
  • java遍历读取整个redis数据库实例

    java遍历读取整个redis数据库实例

    这篇文章主要介绍了java遍历读取整个redis数据库实例,使用支持正则表达式的key搜索方法jedis.keys(“*”)实现,需要的朋友可以参考下
    2014-05-05
  • Java通俗易懂系列设计模式之建造者模式

    Java通俗易懂系列设计模式之建造者模式

    这篇文章主要介绍了Java通俗易懂系列设计模式之建造者模式,对设计模式感兴趣的读者,一定要看一下
    2021-04-04

最新评论