Java多线程实现同时输出
更新时间:2016年03月13日 09:03:23 投稿:hebedich
这篇文章主要介绍了Java多线程实现同时打印的相关资料,需要的朋友可以参考下
一道经典的面试题目:两个线程,分别打印AB,其中线程A打印A,线程B打印B,各打印10次,使之出现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();
}
}
由上面的例子我们可以设计出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();
}
}
再一次证明了软件工程的重要性了;在多线程程序中,应该说在程序中,我们应该把那些业务逻辑代码放到同一个类中,使之高内聚,低耦合
相关文章
SpringBoot中Formatter和Converter用法和区别小结
本文主要介绍了SpringBoot中Formatter和Converter用法和区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2023-07-07
解决spring-boot 打成jar包后 启动时指定参数无效的问题
这篇文章主要介绍了解决spring-boot 打成jar包后 启动时指定参数无效的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-06-06


最新评论