多线程-线程的通信
线程的通信
当我们需要多个线程来共同完成一个任务,并且我们希望他们有规律的执行,那么多线程之间需要一些通讯机制,可以协调他们的工作,以此实现多线程共同操作一份数据.
等待唤醒机制
方法名 | 说明 |
---|---|
wait() | 进入等待状态,会释放对同步监视器的调用 |
notify() | 唤醒被wait()的线程中优先级最高的一个线程(如果有多个并且优先级相同,则随机唤醒) |
notifyAll() | 唤醒所有被wait()的线程 |
注:此三个方法的使用必须是在同步代码块或同步方法中
三个方法的调用者必须是同步监视器,且三个方法都在object类中
线程的交替通行
package com.xiaobai.shangguigu.Test;
//线程通信
public class PrintNumber {
public static void main(String[] args) {
PrintNumberTest p1 = new PrintNumberTest();
new Thread(p1, "线程1").start();
new Thread(p1, "线程2").start();
}
}
class PrintNumberTest implements Runnable {
private int number = 1;
@Override
public void run() {
while (true) {
synchronized (this) {
this.notify();//唤醒线程
if (number <= 100) {
System.out.println(Thread.currentThread().getName() + ":" + number);
number++;
} else {
break;
}
try {
this.wait();//等待线程
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
}
wait()和sleep()的区别
相同点:一旦执行,当前线程都会进入阻塞状态
不同点:
- 声明的位置不通:wait()声明在Object类中,sleep()声明在Thread类中(静态方法)
- 使用场景不同:wait()只能使用在同步代码块(同步方法)中,sleep()可以在任何需要使用的场景
- 对"锁"的使用不同:sleep()不会释放同步监视器,而wait()会释放同步监视器
- 唤醒方式不同:wait()可以被notify唤醒,或时间结束唤醒,而sleep()只能等事件结束后唤醒