Maison  >  Article  >  Java  >  Multi-threading Java pour obtenir une sortie simultanée

Multi-threading Java pour obtenir une sortie simultanée

高洛峰
高洛峰original
2017-01-05 16:58:341769parcourir

Une question d'entretien classique : deux fils de discussion impriment AB respectivement, où le fil A imprime A et le fil B imprime B, chacun s'imprime 10 fois pour le faire apparaître ABABABABA.. effet

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();
  }
}

D'après l'exemple ci-dessus , on peut concevoir un programme avec 3 threads ou même n threads. L'exemple donné ci-dessous est 3 threads, imprimant A, B, C 10 fois respectivement, pour que l'effet ABCABC.. apparaisse

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();
  }
}

Prouve une fois de plus l'importance du génie logiciel ; dans les programmes multithread, il faut dire que dans les programmes, nous devrions mettre ces codes de logique métier dans la même classe pour les rendre à haute cohésion et à faible couplage


Pour plus d'articles sur l'implémentation multi-thread Java et la sortie simultanée, veuillez faire attention au site Web PHP chinois !


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn