wait()和notify()

线程的状态

状态是针对当前线程调度的情况来描述的,也可以认为线程是调度的基本单位,在Java中对线程的状态进行了细化,主要分为下面几种状态

★ 1.NEW创建了Thread对象,但是还没有调用start

★ 2. TERMINATED 表示内核中的pcb已经执行完了,但是Thread对象还在.

★ 3. RUNNABLE 可运行状态,分为两种情况,一种是正在cpu上执行的,另外一种是在就绪队列里面,随时可以去CPU上执行的

★ 4.WAITING,TIMED_WAITING,BLOCKED 都是阻塞状态,都表示线程PCB正在阻塞队列里面.但触发条件不同,.WAITING是wait()方法触发的,TIMED_WAITING是sleep()方法触发的,BLOCKED是synchronized触发的.synchronized的相关操作在另外一篇博客里

synchronized的相关操作

wait()和notify()

线程最大的问题是抢占式执行,随机调度,但为了保证线程的安全,不希望随机调度,程序员就想出一些办法,控制现成的执行顺序,虽然线程在内核中的调度是随机的,但可以通过一些api让线程主动阻塞,主动放弃cpu.

比如有t1,t2两个线程,我们希望t1先执行一半,然后让t2执行,就可以让t2先wait(进入阻塞状态,主动放弃cpu),等t1执行执行一半的时候,在通过notify来通知t2,把t2唤醒,让t2开始执行

wait进行阻塞,某个线程调用wait方法(无论是那个对象),此时就会进入阻塞,此时就处于WAITING状态.

用代码来看看wait的使用方法

运行结果

此时抛出非法的锁状态异常,锁的状态就是被加锁的状态和被解锁的状态.

为什么胡出现这种异常呢,来看看wait的具体操作

1. 先释放锁

2. 进行阻塞等待

3. 收到通知后,重新尝试获取锁,并在获取锁后,继续往下执行

对上面代码进行修改,wait要先释放锁,就要先加锁,我们对上面代码进行加锁操作

运行结果

此时代码阻塞在synchronized代码块里,实际上这里的阻塞是释放了锁,然后进行阻塞等待,此时就处于WAITING 状态,

此时就需要notify来进行通知,然后唤醒wait,同样,notify()和wait()一样,在使用之前要先释放锁.

在对上面代码进行改进

代码的执行结果

在wait()的无参数版本,只要t2不进行notify(),t1就会一直等待下去

在java中wait()还有带参数的版本,可以指定等待的最大时间

还有一个唤醒wait的方法,notifyAll(),此时,当多个线程wait的时候,notify是随机唤醒一个线程,而notifyAll()是唤醒所有线程,这些线程在一起竞争锁.

相关推荐
q***98521 分钟前
什么是Spring Boot 应用开发?
java·spring boot·后端
带刺的坐椅2 分钟前
Solon AI 开发学习4 - chat - 模型实例的构建和简单调用
java·ai·chatgpt·solon
hadage2334 分钟前
--- JavaScript 的一些常用语法总结 ---
java·前端·javascript
合作小小程序员小小店10 分钟前
桌面安全开发,桌面二进制%恶意行为拦截查杀%系统安全开发3.0,基于c/c++语言,mfc,win32,ring3,dll,hook,inject,无数据库
c语言·开发语言·c++·安全·系统安全
合作小小程序员小小店10 分钟前
桌面开发,超市管理系统开发,基于C#,winform,sql server数据库
开发语言·数据库·sql·microsoft·sqlserver·c#
Codeking__12 分钟前
C++ 11 atomic 原子性操作
开发语言·c++
懂得节能嘛.19 分钟前
【Java动态线程池】Redis监控+动态调参
java·开发语言·redis
豆奶特浓626 分钟前
Java面试模拟:当搞笑程序员谢飞机遇到电商秒杀与AIGC客服场景
java·spring boot·微服务·面试·aigc·高并发·电商
明洞日记27 分钟前
【设计模式手册013】命令模式 - 请求封装的优雅之道
java·设计模式·命令模式
方白羽35 分钟前
Android多层嵌套RecyclerView滚动
android·java·kotlin