代码部分
Print.java
public class Print {
private int flag = 1;
synchronized public void printA(){
if(flag == 1){
System.out.print("A");
flag = 2;
try {
this.notifyAll();
} catch (Exception e) {
e.printStackTrace();
}
}else{
try {
this.wait();
} catch (Exception e) {
e.printStackTrace();
}
}
}
synchronized public void printB(){
if(flag == 2){
System.out.print("B");
flag = 3;
try {
this.notifyAll();
} catch (Exception e) {
e.printStackTrace();
}
}else{
try {
this.wait();
} catch (Exception e) {
e.printStackTrace();
}
}
}
synchronized public void printC(){
if(flag == 3){
System.out.print("C");
flag = 1;
try {
this.notifyAll();
} catch (Exception e) {
e.printStackTrace();
}
}else{
try {
this.wait();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
Main.java
public class Main {
static Print print = new Print();
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
for(int i = 0; i < 10; i++){
print.printA();
try {
Thread.sleep(1000);
System.out.println();
} catch (Exception e) {
e.printStackTrace();
};
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while(true){
print.printB();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while(true){
print.printC();
}
}
}).start();
}
}
运行结果
分析
Print类中有三个synchronized的方法,每次仅有一个线程能够使用其中任一方法。
同时通过flag来判断是否打印该字母,实现ABC的顺序打印。
在Main类中,新开三个线程分别循环打印A、B、C。B、C线程当且仅当flag符合要求时才会打印输出并且唤醒所有线程产生线程竞争,否则将会执行线程等待。
在第一个new Thread中为了防止每次循环回来时flag还未重置为1,因此Thread.sleep(1000)确保执行下次循环式flag已重置为1.
网友评论