Skip to content

双线程轮流打印1-100

题目

即, 两个线程轮流打印1-100的奇偶数

解法一

基本思路

  1. 首先按照题意创建两个线程,分别命名为 t1 和 t2, 且t1打印奇数, t2打印偶数
  2. 使用多线程的 wait()notify() 方法, 让两个线程交替打印

解题代码

java
public class TwoThreadsPrint1_100 {

    // 待打印的数
    private int num = 1;
    // 用于同步代码块的锁
    private final Object lock = new Object();

    // 同步打印方法
    public void printNum(boolean isEven) {
        while (num <= 100) {
            synchronized (lock) {
                // 判断当前线程是否应该打印
                // 若当前线程t1 打印偶数但num为奇数时 让t1休眠
                // 若当前线程t2 打印奇数但num为偶数时 让t2休眠
                while ((isEven && num % 2 != 0) || (!isEven && num % 2 == 0)) {
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
                if (num <= 100) {
                    System.out.println("当前线程: " + Thread.currentThread().getName() + "打印: " + num++);
                    lock.notifyAll();
                }
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        // 实例化当前对象
        TwoThreadsPrint1_100 obj = new TwoThreadsPrint1_100();
        // 线程1 负责打印奇数
        Thread t1 = new Thread(() -> obj.printNum(false), "t1");
        // 线程2 负责打印偶数
        Thread t2 = new Thread(() -> obj.printNum(true), "t2");
        // 启动线程
        t2.start();
        t1.start();
        t1.join();
        t2.join();
        System.out.println("执行结束!");
    }
}