java并发编程---wait、notify
来源:互联网 发布:软件企业认定有效期 编辑:程序博客网 时间:2024/05/29 14:50
1、wait()
该方法用来将当前线程置入休眠状态,直到接到通知或被中断为止。在调用wait()之前,线程必须要获得该对象的对象级别锁,即只能在同步方法或同步块中调用wait()方法。进入wait()方法后,当前线程释放锁。在从wait()返回前,线程与其他线程竞争重新获得锁。如果调用wait()时,没有持有适当的锁,则抛出IllegalMonitorStateException,它是RuntimeException的一个子类,因此,不需要try-catch结构。
2、notify()
该方法用来通知那些可能等待该对象的对象锁的其他线程。如果有多个线程等待,则线程规划器任意挑选出其中一个wait()状态的线程来发出通知,并使它等待获取该对象的对象锁(notify后,当前线程不会马上释放该对象锁,wait所在的线程并不能马上获取该对象锁,要等到程序退出synchronized代码块后,当前线程才会释放锁,wait所在的线程也才可以获取该对象锁),但不惊动其他同样在等待被该对象notify的线程们。当第一个获得了该对象锁的wait线程运行完毕以后,它会释放掉该对象锁,此时如果该对象没有再次使用notify语句,则即便该对象已经空闲,其他wait状态等待的线程由于没有得到该对象的通知,会继续阻塞在wait状态,直到这个对象发出一个notify或notifyAll。这里需要注意:它们等待的是被notify或notifyAll,而不是锁。这与下面的notifyAll()方法执行后的情况不同。
3、notifyAll()
notifyAll使所有原来在该对象上wait的线程统统退出wait的状态(即全部被唤醒,不再等待notify或notifyAll,但由于此时还没有获取到该对象锁,因此还不能继续往下执行),变成等待获取该对象上的锁,一旦该对象锁被释放(notifyAll线程退出调用了notifyAll的synchronized代码块的时候),他们就会去竞争。如果其中一个线程获得了该对象锁,它就会继续往下执行,在它退出synchronized代码块,释放锁后,其他的已经被唤醒的线程将会继续竞争获取该锁,一直进行下去,直到所有被唤醒的线程都执行完毕。
4、wait(long)和wait(long,int)
显然,这两个方法是设置等待超时时间的,后者在超值时间上加上ns,精度也难以达到,因此,该方法很少使用。对于前者,如果在等待线程接到通知或被中断之前,已经超过了指定的毫秒数,则它通过竞争重新获得锁,并从wait(long)返回。另外,需要知道,如果设置了超时时间,当wait()返回时,我们不能确定它是因为接到了通知还是因为超时而返回的,因为wait()方法不会返回任何相关的信息。但一般可以通过设置标志位来判断,在notify之前改变标志位的值,在wait()方法后读取该标志位的值来判断,当然为了保证notify不被遗漏,我们还需要另外一个标志位来循环判断是否调用wait()方法。
- java并发编程---wait、notify
- Java并发编程 线程通信wait notify
- Java并发编程:wait()和notify()/notifyAll()
- Java并发编程(详解wait(), notify(),sleep())
- Java并发编程系列之八:wait()、notify()和notifyAll()
- 并发编程-wait,notify实现队列功能
- Java 多线程编程 wait()、notify() -- JAVA 进阶
- java并发编程-线程间协作的两种方式:wait、notify、nitifyAll和Condition
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
- java并发编程之wait,notify,深挖,引申出Monitor概念,简单介绍
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
- 【Java并发编程】:使用wait/notify/notifyAll实现线程间通信的几点重要说明
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
- 发送E-mail
- 初入代码的领域,打开编程的大门
- 责任链模式/过滤器模式
- android通讯录浅谈
- 得到地址栏地址和简单的截取有效数据示例代码
- java并发编程---wait、notify
- 如何搭建一台深度学习服务器
- 并发程序设计模式之Future模式
- SOL第十一章上机题1-5
- Lua 条件语句
- python ddt 数据驱动测试
- 数据结构——树的概述
- Memcached 与 Redis 实现的对比(下)
- springMVC请求流程详解