【Java多线程】交替打印奇偶数

该文章描述了一个Java编程问题,其中涉及三个线程:一个线程负责对变量i进行自增,另外两个线程分别打印奇数和偶数。通过使用ReentrantLock和Condition,确保了线程间的同步,使得打印结果按照奇偶顺序进行,且在i小于50的范围内。

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

需求

使用一个线程对一个数进行循环自增,并且使用另外两个线程对当前的数进行打印,一个线程打印奇数,一个线程打印偶数,要求最终输出结果必须按顺序打印出来

代码

先定义全局变量

// 用于自增的整数
private volatile int i = 0;

// 锁对象
private final Lock lock = new ReentrantLock();

// 满足打印偶数的 Condition
private final Condition evenCondition = lock.newCondition();

// 满足打印奇数的 Condition
private final Condition oddCondition = lock.newCondition();

指定三个线程:

  1. 线程一:对一个整型数(i<50)进行递增

    Thread thIncr = new Thread(() -> {
                try {
                    lock.lock();
                    while (i < 50) {
                        // 每次自增判断奇偶
                        if ((i & 1) == 0) {
                            // 当为偶数时,唤醒等待打印偶数的线程
                            evenCondition.signal();
                            // 等待打印偶数的线程打印完成
                            evenCondition.await();
                        } else {
                            // 当为奇数时,唤醒等待打印偶数的线程
                            oddCondition.signal();
                             // 等待打印奇数的线程打印完成
                            oddCondition.await();
                        }
                        // 每次循环加 1
                        i = i + 1;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    lock.unlock();
                }
            }, "自增线程:");
    
  2. 线程二:打印奇数;

    Thread thOdd = new Thread(() -> {
                try {
                    lock.lock();
                    while (i < 50) {
                    	// 当 i 为偶数时
                        if ((i & 1) == 0) {
                        	// 等待满足奇数的条件
                            oddCondition.await();
                            continue;
                        }
                        // 打印当前奇数
                        System.out.println(Thread.currentThread().getName() + i);
                        // 通知自增线程打印完成
                        oddCondition.signal();
                        // 并重新等待满足奇数的条件
                        oddCondition.await();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    lock.unlock();
                }
            }, "奇数线程:");
    
  3. 线程三:打印偶数;

    Thread thEven = new Thread(() -> {
                try {
                    lock.lock();
                    // 当 i 为奇数时
                    while (i < 50) {
                        if ((i & 1) == 1) {
                            // 等待满足偶数的条件
                            evenCondition.await();
                            continue;
                        }
                         // 打印当前偶数
                        System.out.println(Thread.currentThread().getName() + i);
                         // 通知自增线程打印完成
                        evenCondition.signal();
                        // 并重新等待满足偶数的条件
                        evenCondition.await();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    lock.unlock();
                }
            }, "偶数线程:");
    

运行结果

偶数线程:0
奇数线程:1
偶数线程:2
奇数线程:3
偶数线程:4
奇数线程:5
偶数线程:6
奇数线程:7
偶数线程:8
......
......
偶数线程:44
奇数线程:45
偶数线程:46
奇数线程:47
偶数线程:48
奇数线程:49
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nonoas

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值