Java多线程实现同时输出
一道经典的面试题目:两个线程,分别打印AB,其中线程A打印A,线程B打印B,各打印10次,使之出现ABABABABA..的效果
packagecom.shangshe.path; publicclassThreadAB{ /** *@paramargs */ publicstaticvoidmain(String[]args){ finalPrintbusiness=newPrint(); newThread(newRunnable(){ publicvoidrun(){ for(inti=0;i<10;i++){ business.print_A(); } } }).start(); newThread(newRunnable(){ publicvoidrun(){ for(inti=0;i<10;i++){ business.print_B(); } } }).start(); } } classPrint{ privatebooleanflag=true; publicsynchronizedvoidprint_A(){ while(!flag){ try{ this.wait(); }catch(InterruptedExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } System.out.print("A"); flag=false; this.notify(); } publicsynchronizedvoidprint_B(){ while(flag){ try{ this.wait(); }catch(InterruptedExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } System.out.print("B"); flag=true; this.notify(); } }
由上面的例子我们可以设计出3个线程乃至于n个线程的程序,下面给出的例子是3个线程,分别打印A,B,C10次,使之出现ABCABC..的效果
publicclassThreadABC{ /** *@paramargs */ publicstaticvoidmain(String[]args){ finalPrintbusiness=newPrint(); newThread(newRunnable(){ publicvoidrun(){ for(inti=0;i<100;i++){ business.print_A(); } } }).start(); newThread(newRunnable(){ publicvoidrun(){ for(inti=0;i<100;i++){ business.print_B(); } } }).start(); newThread(newRunnable(){ publicvoidrun(){ for(inti=0;i<100;i++){ business.print_C(); } } }).start(); } } classPrint{ privatebooleanshould_a=true; privatebooleanshould_b=false; privatebooleanshould_c=false; publicsynchronizedvoidprint_A(){ while(should_b||should_c){ try{ this.wait(); }catch(InterruptedExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } System.out.print("A"); should_a=false; should_b=true; should_c=false; this.notifyAll(); } publicsynchronizedvoidprint_B(){ while(should_a||should_c){ try{ this.wait(); }catch(InterruptedExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } System.out.print("B"); should_a=false; should_b=false; should_c=true; this.notifyAll(); } publicsynchronizedvoidprint_C(){ while(should_a||should_b){ try{ this.wait(); }catch(InterruptedExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } System.out.print("C"); should_a=true; should_b=false; should_c=false; this.notifyAll(); } }
再一次证明了软件工程的重要性了;在多线程程序中,应该说在程序中,我们应该把那些业务逻辑代码放到同一个类中,使之高内聚,低耦合