Java多線(xiàn)程實(shí)現(xiàn)同時(shí)輸出
一道經(jīng)典的面試題目:兩個(gè)線(xiàn)程,分別打印AB,其中線(xiàn)程A打印A,線(xiàn)程B打印B,各打印10次,使之出現(xiàn)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(); } }
由上面的例子我們可以設(shè)計(jì)出3個(gè)線(xiàn)程乃至于n個(gè)線(xiàn)程的程序,下面給出的例子是3個(gè)線(xiàn)程,分別打印A,B,C 10次,使之出現(xiàn)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(); } }
再一次證明了軟件工程的重要性了;在多線(xiàn)程程序中,應(yīng)該說(shuō)在程序中,我們應(yīng)該把那些業(yè)務(wù)邏輯代碼放到同一個(gè)類(lèi)中,使之高內(nèi)聚,低耦合
- Java Web項(xiàng)目中使用Socket通信多線(xiàn)程、長(zhǎng)連接的方法
- java多線(xiàn)程編程之Synchronized關(guān)鍵字詳解
- 詳解Java多線(xiàn)程編程中的線(xiàn)程同步方法
- JAVA多線(xiàn)程之中斷機(jī)制stop()、interrupted()、isInterrupted()
- java多線(xiàn)程抓取鈴聲多多官網(wǎng)的鈴聲數(shù)據(jù)
- Java多線(xiàn)程編程中線(xiàn)程鎖與讀寫(xiě)鎖的使用示例
- java多線(xiàn)程之線(xiàn)程安全的單例模式
- 詳解Java實(shí)現(xiàn)多線(xiàn)程的三種方式
- Java 實(shí)現(xiàn)多線(xiàn)程的幾種方式匯總
- Java單利模式與多線(xiàn)程總結(jié)歸納
- 深入理解JAVA多線(xiàn)程之線(xiàn)程間的通信方式
相關(guān)文章
myBatis組件教程之緩存的實(shí)現(xiàn)與使用
這篇文章主要給大家介紹了關(guān)于myBatis組件教程之緩存的實(shí)現(xiàn)與使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11Java?Spring框架的注解式開(kāi)發(fā)你了解嗎
這篇文章主要為大家詳細(xì)介紹了Spring框架的注解式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03SpringCloudConfig之client端報(bào)錯(cuò)Could?not?resolve?placeholder問(wèn)
這篇文章主要介紹了SpringCloudConfig之client端報(bào)錯(cuò)Could?not?resolve?placeholder?‘from‘?in?value?“${from}“問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助2022-12-12SpringBoot如何通過(guò)Feign調(diào)用傳遞Header中參數(shù)
這篇文章主要介紹了SpringBoot通過(guò)Feign調(diào)用傳遞Header中參數(shù),本文給大家分享兩種解決方案給大家詳細(xì)講解,需要的朋友可以參考下2023-04-04idea2020導(dǎo)入spring5.1的源碼詳細(xì)教程
這篇文章主要介紹了idea2020導(dǎo)入spring5.1的源碼的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06IDEA中啟動(dòng)多個(gè)SpringBoot服務(wù)的實(shí)現(xiàn)示例
本文主要介紹了IDEA中啟動(dòng)多個(gè)SpringBoot服務(wù)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08Spring?Boot集成JavaMailSender發(fā)送郵件功能的實(shí)現(xiàn)
spring提供了發(fā)送郵件的接口JavaMailSender,通過(guò)JavaMailSender可以實(shí)現(xiàn)后端發(fā)送郵件,下面這篇文章主要給大家介紹了關(guān)于Spring?Boot集成JavaMailSender發(fā)送郵件功能的相關(guān)資料,需要的朋友可以參考下2022-05-05