古典的なインタビューの質問: 2 つのスレッドがそれぞれ AB を出力します。スレッド A は A を出力し、スレッド B は B を出力します。ABABABA の効果を与えるためにそれぞれ 10 回出力します。
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 マルチスレッドで同時出力を実現 関連記事はこちらPHP中国語ウェブサイトへ!