JDK 中关于wait,notify这两个方法的介绍:

  1、wait:导致当前线程等待,直到另一个线程调用该对象的notify()方法或notifyAll()方法。并且释放锁(Thread.sleep()不释放锁)。后续的代码,不执行。

  2、notify:唤醒线程。后续的代码继续执行。

注意的点:

  1、使用这两个方法,必须拥有对象的监视器。

  2、线程在执行完wait方法后,进入阻塞,释放锁。

  3、执行notify方法后,唤醒执行wait方法的线程,执行wait之后的代码逻辑。

示例:

 

import java.util.ArrayList;
import java.util.List; public class wait_and_notify {
public static void main(String[] args) {
List<Long> lists = new ArrayList<Long>();
Producer p = new Producer(lists); //构造方法进行对象的传递,下同
Consumer c = new Consumer(lists);
new Thread(p).start();
new Thread(c).start();
}
} class Producer implements Runnable {
private long i = 0 ;
List<Long> lists;
private Producer producer; public Producer(List<Long> lists) {
this.lists = lists;
}
@Override
public void run() {
while (true){
synchronized (lists){
if(lists.size() > 10){
lists.notifyAll();
System.out.println("生成者满了");
try {
lists.wait();//后续方法不执行了,等到再次获取cpu时间片,才接着输出 "wait invoke"
System.out.println("wait invoke!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
lists.add(i++);
System.out.println("添加:"+i);
}
}
}
}
} class Consumer implements Runnable {
List<Long> lists;
public Consumer(List<Long> lists) {
this.lists = lists;
}
@Override
public void run() {
while (true){
synchronized (lists){
if(lists.size() <= 0){
lists.notifyAll(); //后续方法继续执行
System.out.println("消费者空了");
try {
lists.wait();
System.out.println("Consumer wait invoke!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
System.out.println(lists.remove(0));
}
}
}
}
}

  

最新文章

  1. javascript 时间格式化
  2. hadoop自动安装的脚本与步骤
  3. 巧用Red Gate SQL Compare破解加密了的存储过程和函数
  4. 新浪微博failed to receive access token
  5. [Angular 2] Using a Reducer to Change an Object&#39;s Property Inside an Array
  6. (11)Xamarin.iOS - 新增iPhone storyboard
  7. 《你不知道的JavaScript》整理(六)——强制类型转换
  8. Apache Ambari安装过程(CentOS 6.5)
  9. mysql 的crud操作(增删改查)
  10. Iar8.1安装包破解
  11. 使用fiddle处理跨域
  12. MetaMask/metamask-extension/mascara 的运行实现
  13. JS实现简单的运行代码 &amp; 侧边广告
  14. MySQL 安装与使用(三)
  15. hexo修改Next主题的样式
  16. How to map Actions to a certain RibbonPage and RibbonGroup using the Application Model or in code
  17. sprint2 (第八天)
  18. django中使用FastDFS分布式文件系统接口代码实现文件上传、下载、更新、删除
  19. 【Java面试题】38 Collection 和 Collections的区别
  20. 【CodeForces】913 E. Logical Expression

热门文章

  1. php对ip地址的处理
  2. Elasticsearch入门CRUD(新增、查询、修改、删除)
  3. java使用Redis8--3.0集群
  4. 总结day3 ---- 进制转换,字符串切片,字符串常用方法.,for 循环,
  5. JavaScript执行环境和作用域(链)的那些事
  6. 华南理工大学“三七互娱杯”程序设计竞赛 HRY and codefire(概率期望DP)
  7. Access network
  8. java使用freemarker生成word文档
  9. linux inotifywait 下监控是否有IO
  10. JDBC处理可滚动的处理集