3个线程,分别打印A,B,C,循环打印ABC十次

本文介绍了一个使用Java多线程实现循环打印ABC字符的应用案例。通过三个线程分别控制打印A、B、C字符,并利用synchronized关键字和wait/notify机制确保了线程间的有序执行。文章展示了如何通过共享对象来协调线程执行顺序,最终实现按顺序循环打印ABC十次。

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

package test.thread;

/**3个线程,分别打印A,B,C,循环打印ABC十次
 * @author lsh
 *
 */
public class TestABC {

	public static void main(String[] args) throws Exception {
		ABC abc = new ABC();	//多线程中用来锁住对象 操作,已实现同步功能
		A a = new A(abc);
		B b = new B(abc);
		C c = new C(abc);
		Thread tA = new Thread(a);
		Thread tB = new Thread(b);
		Thread tC = new Thread(c);
		tC.start();
		tB.start();
		tA.start();
		tA.join();	//等待线程完成
		tB.join();
		tC.join();
		System.out.println("完成");
	}
}

class ABC {
	int i = 1;	//打印ABC的标志,1打印A,2打印B,3打印C
}

/**	线程A 打印 字符A
 * @author lsh
 *
 */
class A implements Runnable {
	ABC abc;

	public A(ABC abc) {
		this.abc = abc;
	}

	private void prin() {
		synchronized (abc) {
			try {
				for (int i = 0; i < 10; i++) {
					while (abc.i != 1) {
						abc.wait();	//等待
					}
					System.out.print("A");
					abc.i = 2;
					abc.notifyAll();//释放对象锁
				}

			} catch (Exception e) {
				e.printStackTrace();
				abc.notifyAll();
			}
		}
	}

	@Override
	public void run() {
		prin();
	}

}

/**	线程B 打印 字符B
 * @author lsh
 *
 */
class B implements Runnable {
	ABC abc;

	public B(ABC abc) {
		this.abc = abc;
	}

	private void prin() {
		synchronized (abc) {
			try {
				for (int i = 0; i < 10; i++) {
					while (abc.i != 2) {
						abc.wait();
					}
					System.out.print("b");
					abc.i = 3;
					abc.notifyAll();
				}
			} catch (Exception e) {
				e.printStackTrace();
				abc.notifyAll();
			}
		}
	}

	@Override
	public void run() {
		prin();
	}

}

/**	线程C 打印 字符C
 * @author lsh
 *
 */
class C implements Runnable {
	ABC abc;

	public C(ABC abc) {
		this.abc = abc;
	}

	private void prin() {
		synchronized (abc) {
			try {
				for (int i = 0; i < 10; i++) {
					while (abc.i != 3) {
						abc.wait();
					}
					System.out.println("c"+"   "+(i+1)+"次");
					abc.i = 1;
					abc.notifyAll();
				}
			} catch (Exception e) {
				e.printStackTrace();
				abc.notifyAll();
			}
		}
	}

	@Override
	public void run() {
		prin();
	}

}

可以使用信号量来实现线程的同步,代码如下: ```python import threading class ABCPrinter: def __init__(self): self.sem_a = threading.Semaphore(1) self.sem_b = threading.Semaphore(0) self.sem_c = threading.Semaphore(0) def print_a(self): for i in range(10): self.sem_a.acquire() print(&#39;A&#39;, end=&#39;&#39;) self.sem_b.release() def print_b(self): for i in range(10): self.sem_b.acquire() print(&#39;B&#39;, end=&#39;&#39;) self.sem_c.release() def print_c(self): for i in range(10): self.sem_c.acquire() print(&#39;C&#39;, end=&#39;&#39;) self.sem_a.release() printer = ABCPrinter() thread_a = threading.Thread(target=printer.print_a) thread_b = threading.Thread(target=printer.print_b) thread_c = threading.Thread(target=printer.print_c) thread_a.start() thread_b.start() thread_c.start() thread_a.join() thread_b.join() thread_c.join() ``` 每个线程都会通过 acquire() 方法等待信号量,当信号量的值大于 0 时,线程会继续执行,同时将信号量的值减 1。当线程执行完任务后,会通过 release() 方法将信号量的值加 1。在这个例子中,每个线程都有一个信号量,用来控制打印的顺序。初始时,A 线程的信号量为 1,B 和 C 线程的信号量为 0,因此 A 线程会先执行。当 A 线程打印完后,会将 B 线程的信号量加 1,然后等待自己的信号量被释放。B 线程接着执行,打印完后将 C 线程的信号量加 1,然后等待自己的信号量被释放。C 线程接着执行,打印完后将 A 线程的信号量加 1,然后等待自己的信号量被释放。依此类推,直到所有线程打印十次才结束。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值