线程的通信
线程的通信
线程的状态
- 新建
- 就绪
- 运行
- 阻塞
- 死亡
通信涉及到三个方法
- wait()
- 一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器
- notify()
- 一旦执行此方法,就会唤醒被wait()的一个线程
- 如果有多个线程被wait,就唤醒优先级高的那个线程
- 线程之间没有优先级就随机唤醒
- notifyAll()
- 一旦执行此方法,就会唤醒所有被wait()的线程
代码实现
class Number implements Runnable {
private int num = 1;
@Override
public void run() {
while (true) {
synchronized (this) {
notify();
if (num <= 100) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":" + num);
num++;
try {
//使得调用如下wait()方法的线程进入阻塞状态
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
break;
}
}
}
}
}
public class CommunicationTest {
public static void main(String[] args) {
Number number = new Number();
Thread t1 = new Thread(number);
Thread t2 = new Thread(number);
t1.setName("线程1");
t2.setName("线程2");
t1.start();
t2.start();
}
}
注意
- wait()、notify()、notifyAll()这三个方法必须使用在同步代码块或同步方法中
- 这三个方法的调用者必须是同步代码块或同步方法中的监视器,否则会出现IllegalMonitorStateException异常
- 这三个方法是定义在java.lang.Object类中
sleep()与wait()异同
不同点
- 两个方法声明的位置不同
- Thread类中声明sleep()方法
- 此方法是静态方法
- Object类中声明wait()方法
- Thread类中声明sleep()方法
- 调用的范围要求不同
- sleep()可以在任何需要的场景下调用
- wait()必须使用在同步代码块和同步方法中
- 是否释放同步监视器(如果两个方法都是使用在同步代码块或同步方法中)
- sleep()方法不会释放同步监视器
- wait()会释放同步监视器
相同点
一旦执行方法,都可以使得当前线程进入阻塞状态
线程的通信
原文地址:https://www.cnblogs.com/CrabDumplings/p/13358157.html