线程练习||启动3个线程打印递增的数字, 线程1先打印1,2,3,4,5, 然后是线程2打印6,7,8,9,10, 然后是线程3打印11,12,13,14,15. 接着再由线程1打印16,17,18,

本文介绍了如何启动三个线程,按照特定顺序打印递增的数字。线程1先打印1-5,接着线程2打印6-10,然后线程3打印11-15,如此循环直至打印到75。通过示例代码展示了具体的实现过程和输出结果。

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

题目描述:

启动3个线程打印递增的数字, 线程1先打印1,2,3,4,5, 然后是线程2打印6,7,8,9,10, 然后是线程3打印11,12,13,14,15. 接着再由线程1打印16,17,18,19,20….以此类推, 直到打印到75. 

代码实现:

class MyThread extends Thread {
	private String name;
	private String p1;
	private String p2;
	private int count = 0;

	public MyThread(String name, String p1, String p2, int count) {
		this.name = name;
		this.p1 = p1;
		this.p2 = p2;
		this.count = count;
	}

	@Override
	public void run() {
		while (count <= 75) {//总线程结束的条件
			synchronized (p1) {
				synchronized (p2) {
					for (int i = 0; i < 5; i++) {// 循环5次,每个线程打印五个数
						count += 1;
						if (count > 75)
							break;
						System.out.println(name + "---" + count);
					}
					count += 10;
					p2.notify();
				}
				try {
					p1.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}

			}

		}

	}

}

public class 线程打印 {
	public static void main(String[] args) throws InterruptedException {
### 使用 `synchronized` 和 `wait/notifyAll` 实现三线程交替打印 为了使三个线程能够按照指定顺序依次打印数字,可以采用 Java 中的同步机制来控制线程间的协作。具体来说,通过共享对象上的监视器锁 (`monitor lock`) 来协调各个线程的行为。 下面是一个基于 `synchronized`, `wait()` 及 `notifyAll()` 方法的例子: ```java public class PrintInOrder { private static final Object LOCK = new Object(); private volatile int state; // 记录当前应该由哪个线程工作 private volatile int number; public void threadOne() throws InterruptedException { while (number <= 30) { synchronized (LOCK) { if (state != 1 || number % 3 != 1) { // 判断是否轮到自己以及是否有剩余任务 LOCK.wait(); // 如果不是自己的回合,则等待其他线程唤醒 } else { System.out.println(Thread.currentThread().getName() + ": " + number++); state++; LOCK.notifyAll(); // 唤醒所有正在等待中的线程 } } } } public void threadTwo() throws InterruptedException { while (number <= 30) { synchronized (LOCK) { if (state != 2 || number % 3 != 2) { LOCK.wait(); } else { System.out.println(Thread.currentThread().getName() + ": " + number++); state++; LOCK.notifyAll(); } } } } public void threadThree() throws InterruptedException { while (number <= 30) { synchronized (LOCK) { if (state != 3 && number % 3 != 0) { LOCK.wait(); } else { System.out.println(Thread.currentThread().getName() + ": " + number++); state = 1; LOCK.notifyAll(); } } } } public static void main(String[] args) throws Exception { PrintInOrder printer = new PrintInOrder(); Thread t1 = new Thread(() -> { try { printer.threadOne(); } catch (InterruptedException e) { throw new RuntimeException(e); } }, "Thread-1"); Thread t2 = new Thread(() -> { try { printer.threadTwo(); } catch (InterruptedException e) { throw new RuntimeException(e); } }, "Thread-2"); Thread t3 = new Thread(() -> { try { printer.threadThree(); } catch (InterruptedException e) { throw new RuntimeException(e); } }, "Thread-3"); t1.start(); t2.start(); t3.start(); t1.join(); t2.join(); t3.join(); } } ``` 在这个例子中,定义了一个名为 `PrintInOrder` 的类,它包含了用于管理线程间通信的状态变量 `state` 和要打印的数值 `number`. 这些状态被声明为 `volatile` 类型以确保可见性[^1]. 每个线程都尝试获取同一个对象实例上的锁,在持有该锁期间检查自身的条件是否满足;如果不满足则调用 `wait()` 放弃对该锁的竞争并进入休眠直到收到通知为止。当某个线程完成了它的操作后会更新全局状态并通过 `notifyAll()` 调用来告知其它可能处于等待状态下的线程重新竞争锁资源.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值