使用3个线程依次打印 ABC

本文介绍了一个使用Java实现的多线程同步问题解决方案。通过三个线程A、B、C循环打印字符,确保输出顺序正确且同步进行。利用ReentrantLock和Condition实现了精确的线程控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自尚硅谷官网例子



import java.util.concurrent.locks.Condition;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


/*
 * 编写一个程序,开启 3 个线程,这三个线程的 ID 分别为 A、B、C,每个线程将自己的 ID 在屏幕上打印 10 遍,要求输出的结果必须按顺序显示。
 * 如:ABCABCABC…… 依次递归
 */
public class TestABCAlternate {

public static void main(String[] args) {
AlternateDemo ad = new AlternateDemo();

new Thread(new Runnable() {
@Override
public void run() {

for (int i = 1; i <= 20; i++) {
ad.loopA(i);
}

}
}, "A").start();

new Thread(new Runnable() {
@Override
public void run() {

for (int i = 1; i <= 20; i++) {
ad.loopB(i);
}

}
}, "B").start();

new Thread(new Runnable() {
@Override
public void run() {

for (int i = 1; i <= 20; i++) {
ad.loopC(i);

System.out.println("-----------------------------------");
}

}
}, "C").start();
}


}


class AlternateDemo{

private int number = 1; //当前正在执行线程的标记

private Lock lock = new ReentrantLock();
private Condition condition1 = lock.newCondition();
private Condition condition2 = lock.newCondition();
private Condition condition3 = lock.newCondition();

/**
* @param totalLoop : 循环第几轮
*/
public void loopA(int totalLoop){
lock.lock();

try {
//1. 判断
if(number != 1){
condition1.await();
}

//2. 打印
for (int i = 1; i <= 1; i++) {
System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + totalLoop);
}

//3. 唤醒
number = 2;
condition2.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}

public void loopB(int totalLoop){
lock.lock();

try {
//1. 判断
if(number != 2){
condition2.await();
}

//2. 打印
for (int i = 1; i <= 1; i++) {
System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + totalLoop);
}

//3. 唤醒
number = 3;
condition3.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}

public void loopC(int totalLoop){
lock.lock();

try {
//1. 判断
if(number != 3){
condition3.await();
}

//2. 打印
for (int i = 1; i <= 1; i++) {
System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + totalLoop);
}

//3. 唤醒
number = 1;
condition1.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}

}
### Java ABC线程交替打印的实现 为了实现三个线程 A、B 和 C 的交替打印,可以利用 `synchronized` 关键字来控制线程之间的执行顺序。通过共享对象上的锁机制以及等待/通知模式 (`wait()` 和 `notify()`) 来协调线程的行为。 以下是基于题目需求的一个完整解决方案: #### 使用 synchronized 实现线程交替打印 ```java public class ThreadPrintABC { private static final Object lock = new Object(); private static int state = 0; // 控制状态变量 public static void main(String[] args) { Thread threadA = new Thread(() -> { for (int i = 0; i < 10; i++) { synchronized (lock) { while (state % 3 != 0) { // 当前不是 A 打印的时间 try { lock.wait(); // 等待其他线程的通知 } catch (InterruptedException e) { e.printStackTrace(); } } System.out.print("A"); state++; // 修改状态 lock.notifyAll(); // 唤醒所有等待中的线程 } } }); Thread threadB = new Thread(() -> { for (int i = 0; i < 10; i++) { synchronized (lock) { while (state % 3 != 1) { // 当前不是 B 打印的时间 try { lock.wait(); // 等待其他线程的通知 } catch (InterruptedException e) { e.printStackTrace(); } } System.out.print("B"); state++; lock.notifyAll(); } } }); Thread threadC = new Thread(() -> { for (int i = 0; i < 10; i++) { synchronized (lock) { while (state % 3 != 2) { // 当前不是 C 打印的时间 try { lock.wait(); // 等待其他线程的通知 } catch (InterruptedException e) { e.printStackTrace(); } } System.out.print("C"); state++; lock.notifyAll(); } } }); threadA.start(); threadB.start(); threadC.start(); } } ``` 上述代码中,使用了一个共享的对象 `lock` 来作为同步锁,并定义了整型变量 `state` 来记录当前应该由哪个线程打印字符[^1]。每个线程在进入临界区之前都会检查自己的条件是否满足;如果不满足,则调用 `wait()` 方法让该线程暂停并释放锁资源。当某个线程完成其任务后会唤醒其他处于等待状态下的线程以便它们继续竞争锁资源。 此方法能够确保三个线程严格按照指定顺序依次打印所需的字符串。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值