多线程-线程的通信

线程的通信

当我们需要多个线程来共同完成一个任务,并且我们希望他们有规律的执行,那么多线程之间需要一些通讯机制,可以协调他们的工作,以此实现多线程共同操作一份数据.


等待唤醒机制

方法名 说明
wait() 进入等待状态,会释放对同步监视器的调用
notify() 唤醒被wait()的线程中优先级最高的一个线程(如果有多个并且优先级相同,则随机唤醒)
notifyAll() 唤醒所有被wait()的线程

注:此三个方法的使用必须是在同步代码块或同步方法中

三个方法的调用者必须是同步监视器,且三个方法都在object类中


线程的交替通行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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()只能等事件结束后唤醒


多线程-线程的通信
http://blog.170827.xyz/2024/03/09/多线程-线程的通信/
作者
XIAOBAI
发布于
2024年3月9日
许可协议