Java多線程實現(xiàn)同時輸出
一道經(jīng)典的面試題目:兩個線程,分別打印AB,其中線程A打印A,線程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è)計出3個線程乃至于n個線程的程序,下面給出的例子是3個線程,分別打印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();
}
}
再一次證明了軟件工程的重要性了;在多線程程序中,應(yīng)該說在程序中,我們應(yīng)該把那些業(yè)務(wù)邏輯代碼放到同一個類中,使之高內(nèi)聚,低耦合
相關(guān)文章
SpringBoot中Formatter和Converter用法和區(qū)別小結(jié)
本文主要介紹了SpringBoot中Formatter和Converter用法和區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-07-07
解決spring-boot 打成jar包后 啟動時指定參數(shù)無效的問題
這篇文章主要介紹了解決spring-boot 打成jar包后 啟動時指定參數(shù)無效的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
Java中JDBC事務(wù)與JTA分布式事務(wù)總結(jié)與區(qū)別
Java事務(wù)的類型有三種:JDBC事務(wù)、JTA(Java Transaction API)事務(wù)、容器事務(wù),本文詳細介紹了JDBC事務(wù)與JTA分布式事務(wù),有需要的可以了解一下。2016-11-11

