1. wait() 和 notify() 方法是Object的方法
首先需要了解,wait() 和 notify() 方法不是Thread的独有的方法,是Objet的方法。同时还需要了解,wait() 和 notify() 一定是和synchronized配合使用的。
wait() 和 notify() 是用来进行线程通信的。
wait() 会释放锁,sleep()则不会释放锁。
2. 经典案例: 两个线程轮流输出 1a2b3c…
有两个线程,
Thread_a 输出 1 2 3 4 …
Thread_b 输出 a b c d …
两个线程交替输出,最终输出结果为:1 a 2 b 3 c …
package com.test;
/**
* 实现两个线程交替输出
*
* @date 2022/5/1
* @since 1.0
**/
public class ThreadDemo {
private final Object monitor = new Object();
public void printNumbers() throws InterruptedException {
synchronized (monitor) {
for (int i = 1; i <= 26; i ++) {
System.out.println(i);
monitor.notify();
monitor.wait();
}
monitor.notify();
}
}
public void printLetters() throws InterruptedException {
synchronized (monitor) {
for (int i = 1; i <= 26; i ++) {
System.out.println((char) (i + 96));
monitor.notify();
monitor.wait();
}
monitor.notify();
}
}
public static void main(String[] args) throws InterruptedException {
ThreadDemo threadDemo = new ThreadDemo();
new Thread(() -> {
try {
threadDemo.printNumbers();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}, "t1").start();
new Thread(() -> {
try {
threadDemo.printLetters();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}, "t2").start();
}
}