使用三个线程交替打印ABC,实现顺序打印
题目描述:建立三个线程A、B、C,A线程打印10次字母A,B线程打印10次字母B,C线程打印10次字母C,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印。
Synchronized同步
使用Synchronized同步、wait、notifyAll方法来控制线程的顺序执行。在并发场景下,可能会导致线程到达的顺序并不是一致的,所以在获取到锁之后,对当前线程所拥有的info与当前所需要输出的信息进行判断,如果相同,直接输出;否则将线程重新挂起等待。当前线程执行所有操作之后,需要唤醒所有的线程,使用notifyAll()方法。
package com.wlh.thread;
public class Demo {
// 定义需要输出的数组的信息
private static String[] INFO = {"A", "B", "C"};
// 定义数组的下标
private static volatile int INDEX = 0;
// 定义打印次数
private static final int NUM = 10;
// 继承Runable,实现需要执行的任务
static class Task implements Runnable{
// 需要打印的信息
private String info;
public Task(String info){
this.info = info;
}
@Override
public void run() {
// 使用for循环进行打印
for (int i = 0; i < NUM; i++) {
// 使用同步锁进行加锁操作
synchronized (Task.class){
// 通过判断当前线程的info是否满足条件
while (!info.equals(INFO[INDEX])){
try {
// 不满足条件主动释放锁,进入等待
Task.class.wait();
}catch (InterruptedException e){
e.printStackTrace();
}
}
System.out.println(info);
if (INDEX == INFO.length - 1){
System.out.println();
}
// 下一个线程所需要打印的下标
INDEX = (INDEX + 1) % INFO.length;
// 唤醒所有的线程
Task.class.notifyAll();
}
}
}
}
public static void main(String[] args) {
new Thread(new Task("A")).start();
new Thread(new Task("B")).start();
new Thread(new Task("C")).start();
}
}