线程的通信
解决的问题:
线程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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」