Skip to content

线程顺序

一、T1、T2、T3按顺序执行(join方案)

原理

join()方法会让当前线程阻塞,直到被调用的线程完全执行完毕才会继续运行。在T2内部调用t1.join(),T3内部调用t2.join(),即可保证执行顺序T1→T2→T3。

核心代码

java
Thread t1 = new Thread(() -> System.out.println("t1"));
Thread t2 = new Thread(() -> {
    try {
        t1.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("t2");
});
Thread t3 = new Thread(() -> {
    try {
        t2.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("t3");
});
t1.start();
t2.start();
t3.start();

二、notify()与notifyAll()区别

  1. notify():随机唤醒一个正在该锁上wait()的线程,其余线程继续等待。
  2. notifyAll():唤醒所有正在该锁上wait()的线程,全部进入竞争锁状态。

三、面试高频问题解析

  1. 问:如何保证T1、T2、T3三个线程按顺序执行?

    答: 可以使用Thread的join()方法。在T2线程内部调用t1.join(),等待T1执行完成再执行T2;在T3线程内部调用t2.join(),等待T2执行完成再执行T3,以此固定T1→T2→T3的执行顺序。

  2. 问:join()调用后线程会进入什么状态?

    答: 调用join()的线程会进入TIMED_WAITING计时等待状态,直到目标线程执行完毕才恢复为RUNNABLE。

  3. 问:notify()和notifyAll()有什么区别?

    答: notify()只会随机唤醒一个处于wait等待的线程;notifyAll()会唤醒当前锁下所有wait阻塞的线程,全部进入锁竞争队列。

  4. 问:生产环境推荐用notify还是notifyAll?

    答: 优先使用notifyAll,notify存在线程永久等待的风险,容易出现线程饿死问题。

Powered by VitePress 1.6.4 | 持续更新中