主题切换
线程顺序
一、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()区别
- notify():随机唤醒一个正在该锁上wait()的线程,其余线程继续等待。
- notifyAll():唤醒所有正在该锁上wait()的线程,全部进入竞争锁状态。
三、面试高频问题解析
问:如何保证T1、T2、T3三个线程按顺序执行?
答: 可以使用Thread的join()方法。在T2线程内部调用t1.join(),等待T1执行完成再执行T2;在T3线程内部调用t2.join(),等待T2执行完成再执行T3,以此固定T1→T2→T3的执行顺序。
问:join()调用后线程会进入什么状态?
答: 调用join()的线程会进入TIMED_WAITING计时等待状态,直到目标线程执行完毕才恢复为RUNNABLE。
问:notify()和notifyAll()有什么区别?
答: notify()只会随机唤醒一个处于wait等待的线程;notifyAll()会唤醒当前锁下所有wait阻塞的线程,全部进入锁竞争队列。
问:生产环境推荐用notify还是notifyAll?
答: 优先使用notifyAll,notify存在线程永久等待的风险,容易出现线程饿死问题。