古典的なインタビューの質問:それぞれ2つのスレッドを印刷します。その中には、スレッドAが印刷され、スレッドBがBを印刷し、それぞれ10回印刷して、アバババの効果が...
パッケージcom.shangshe.path; public class threadab { / ** * @param args * / public static void main(string [] args){final print business = new Print();新しいスレッド(new runnable(){public void run(){for(int i = 0; i <10; i ++){business.print_a();}}}})。start();新しいスレッド(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(arturnedexception e){// todo auto-fenated catch block e.printstacktrace(); }} system.out.print( "a"); flag = false; this.notify(); } public synchronized void print_b(){while(flag){try {this.wait(); } catch(arturnedexception e){// todo auto-fenated 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スレッド(new runnable(){public void run(){for(int i = 0; i <100; i ++){business.print_a();}}})。start();新しいスレッド(new runnable(){public void run(){for(int i = 0; i <100; i ++){business.print_b();}}}})。start(); newスレッド(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 sefs_b = false; private boolean should_c = false; public synchronized void print_a(){while(shold_b || should_c){try {this.wait(); } catch(arturnedexception e){// todo auto-fenated 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(arturnedexception e){// todo auto-fenated catch block e.printstacktrace(); }} system.out.print( "b"); should_a = false; suld_b = false; should_c = true; this.notifyall(); } public synchronized void print_c(){while(should_a || should_b){try {this.wait(); } catch(arturnedexception e){// todo auto-fenated catch block e.printstacktrace(); }} system.out.print( "c"); should_a = true; suld_b = false; should_c = false; this.notifyall(); }}繰り返しになりますが、ソフトウェアエンジニアリングの重要性が証明されています。マルチスレッドプログラムでは、プログラムでは、ビジネスロジックコードを同じクラスに入れて、非常にまとまりのあるカップリングを行う必要があると言われるべきです。