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

需求

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

代码

先定义全局变量

// 用于自增的整数
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

你可能感兴趣的:(Java,java,多线程,ReentrantLock)