线程的通信

解决的问题:

线程1和线程2交替打印1——100中的数字

涉及到的三个方法:
wait():执行该方法,当前线程进入阻塞状态,并释放同步监视器
notify():执行该方法,就会唤醒被wait的一个线程,如果有多个被wait,则唤醒优先级最高的那个线程
notifyAll():执行该方法,就会唤醒所有被wait的线程

说明:
1.wait(),notify(),notifyAll():必须使用在同步代码块或同步方法中
2.1中三个方法的调用者必须是同步代码块或同步方法中的同步监视器(锁),否则会出现异常
3.1中的三个方法是定义在java.lang.object当中

sleep()和wait()方法的异同
1.相同点:一旦执行该方法,都可以使线程进入阻塞状态。
2.不同点:
(1).方法的位置不同:sleep()在Thread类中,wait()在Object类中
(2).调用的要求不同:sleep()可在任何需要情况下调用,wait()方法必须在同步代码块下由同步监视器下调用
(3).是否释放同步监视器:如果两个方法都在同步代码块中,sleep()不会释放同步监视器,wait()会释放同步监视器

 

代码:

复制代码
 1 class Number implements Runnable {
 2     private int num = 1;
 3     @Override
 4     public void run() {
 5         synchronized (this) {
 6             //将睡眠(处于wait状态)的线程唤醒
 7             notifyAll();
 8             while (true) {
 9                 if (num <= 100) {
10                     System.out.println(Thread.currentThread().getName() + ":" + num);
11                     num++;
12                     try {
13                         //使得wait()方法的线程进入阻塞状态
14                         wait();
15                     } catch (InterruptedException e) {
16                         e.printStackTrace();
17                     }
18                 } else {
19                     break;
20                 }
21             }
22         }
23     }
24 }
25 
26 public class CommunicationTest {
27     public static void main(String[] args) {
28         Number number = new Number();
29         Thread t1 = new Thread(number);
30         Thread t2 = new Thread(number);
31         t1.setName("线程1");
32         t2.setName("线程2");
33 
34         t1.start();
35         t2.start();
36     }
37 
38 }
复制代码

 

posted @   jue1e0  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示