1、源码

wait() notify() notifyAll()都是Object类中方法。源码如下所示:

  1. public final native void notify();
  2. public final native void notifyAll();
  3. public final native void wait(long timeout) throws InterruptedException;
  4. public final void wait() throws InterruptedException {
  5. wait(0);
  6. }

可以看到它们都是final native修饰的方法。

2、使用条件

首先我们需要明确的一点是wait() notify() notifyAll()都是需要在线程拥有对象锁的情况下使用

在没有对象锁的情况下使用会抛出异常。执行下面代码,会抛出 java.lang.IllegalMonitorStateException 异常

  1. package com.test;
  2.  
  3. public class Test {
  4. public static void main(String[] args){
  5. try {
  6. Object obj = new Object();
  7. obj.wait();
  8. } catch (Exception e) {
  9. // TODO: handle exception
  10. e.printStackTrace();
  11. }
  12. }
  13. }

3、作用

3.1 wait()方法的作用

wait()方法能够使当前线程停止,进入阻塞序列,等待被唤醒。

wait()方法被调用后,当前线程会立即释放持有的对象锁。其他线程可以通过竞争的方式获取该对象锁。

唤醒处于阻塞状态的线程,需要其他线程使用notify()或者notifyAll()方法。

3.2 notify()方法的作用

notify()方法能够唤醒处于阻塞状态(处于阻塞队列中)的线程。

需要注意的是调用一次notify()方法只能唤醒一个处于阻塞状态的线程。

而且调用notify()方法后,当前线程不会马上释放锁,被notify 的线程也不会马上获取该对象锁,而是需要等待当前线程执行完同步代码块。

3.3 notifyAll()方法的作用

notifyAll()方法能够唤醒正在等待同意共享资源的所有线程。

4、实例

直接上代码咯。

  1. package com.test;
  2.  
  3. public class Test3 {
  4.  
  5. class WaitThread implements Runnable{
  6.  
  7. private Object lock;
  8.  
  9. public WaitThread(Object lock) {
  10. // TODO Auto-generated constructor stub
  11. super();
  12. this.lock = lock;
  13. }
  14.  
  15. @Override
  16. public void run() {
  17. // TODO Auto-generated method stub
  18. try {
  19. synchronized (lock) {
  20. System.out.println(Thread.currentThread().getName() +
  21. " 即将进入阻塞状态 wait time = " + System.currentTimeMillis());
  22. lock.wait();
  23. System.out.println(Thread.currentThread().getName() +
  24. " 结束阻塞状态 wait time = " + System.currentTimeMillis());
  25. }
  26. } catch (Exception e) {
  27. // TODO: handle exception
  28. e.printStackTrace();
  29. }
  30. }
  31. }
  32.  
  33. class NotifyThread implements Runnable{
  34.  
  35. private Object lock;
  36.  
  37. public NotifyThread(Object lock) {
  38. // TODO Auto-generated constructor stub
  39. super();
  40. this.lock = lock;
  41. }
  42.  
  43. @Override
  44. public void run() {
  45. // TODO Auto-generated method stub
  46. try {
  47. synchronized (lock) {
  48. System.out.println(Thread.currentThread().getName() +
  49. " 即将唤醒 notify time = " + System.currentTimeMillis());
  50. lock.notify();
  51. System.out.println(Thread.currentThread().getName() +
  52. " 唤醒线程执行结束 notify time = " + System.currentTimeMillis());
  53. }
  54. } catch (Exception e) {
  55. // TODO: handle exception
  56. e.printStackTrace();
  57. }
  58. }
  59. }
  60.  
  61. public static void main(String[] args){
  62. try {
  63. Object lock = new Object();
  64. Test3 test3 = new Test3();
  65. Thread waitThread = new Thread(test3.new WaitThread(lock));
  66. waitThread.start();
  67. Thread.sleep(3000);
  68. Thread notifyThread = new Thread(test3.new NotifyThread(lock));
  69. notifyThread.start();
  70. } catch (Exception e) {
  71. // TODO: handle exception
  72. }
  73. }
  74. }

5、总结

1 wait() notify() notifyAll() 方法只能在线程拥有对象锁的时候调用

2 wait()方法调用后 当前线程会立即释放锁

3 notify() notifyAll()方法执行后 当前对象并不会立即释放锁,而是要等同步代码块执行完成后才能释放锁

4 notify()方法每次调用后只能唤醒处于阻塞队列中的一个线程,如果需要唤醒等待当前资源的所有线程需要使用notifyAll()方法

Java多线程编程——wait()和notify()、notifyAll()的更多相关文章

  1. java多线程的wait、notify/notifyAll区别

    1.wait().notify/notifyAll() 方法是Object的本地final方法,无法被重写.   2.wait()使当前线程阻塞,前提是 必须先获得锁,一般配合synchronized ...

  2. Java多线程编程——进阶篇二

    一.线程的交互 a.线程交互的基础知识 线程交互知识点需要从java.lang.Object的类的三个方法来学习:    void notify()           唤醒在此对象监视器上等待的单个 ...

  3. Java多线程编程详解

    转自:http://programming.iteye.com/blog/158568 线程的同步 由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题.Ja ...

  4. Java多线程编程的常见陷阱(转)

    Java多线程编程的常见陷阱 2009-06-16 13:48 killme2008 blogjava 字号:T | T 本文介绍了Java多线程编程中的常见陷阱,如在构造函数中启动线程,不完全的同步 ...

  5. Java多线程编程总结(精华)

    Java多线程编程总结 2007-05-17 11:21:59 标签:多线程 java 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http ...

  6. Java多线程编程核心技术

    Java多线程编程核心技术 这本书有利于对Java多线程API的理解,但不容易从中总结规律. JDK文档 1. Thread类 部分源码: public class Thread implements ...

  7. 《Java 多线程编程核心技术》- 笔记

    作为业务开发人员,能够在工作中用到的技术其实不多.虽然平时老是说什么,多线程,并发,注入,攻击!但是在实际工作中,这些东西不见得用得上.因为,我们用的框架已经把这些事做掉了. 比如web开发,外面有大 ...

  8. Java多线程编程核心技术(三)多线程通信

    线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时 ...

  9. Java多线程编程实战指南(核心篇)读书笔记(三)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76686044冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

随机推荐

  1. SpringCloud学习(6)——Hystrix熔断器

    分布式系统面临的问题 复杂的分布式体系结构中的应用程序有数十个依赖关系, 每个依赖关系在某些时刻不可避免的失败. 服务雪崩效应 多个微服务调用的时候, 假设微服务A调用微服务B和微服务C, 微服务B和 ...

  2. [USACO14JAN]Recording the Moolympics

    题目描述 Being a fan of all cold-weather sports (especially those involving cows), Farmer John wants to ...

  3. Codeforces 221 A. Little Elephant and Function

    A. Little Elephant and Function time limit per test 2 seconds memory limit per test 256 megabytes in ...

  4. 【leetcode 简单】 第五十一题 有效电话号码

    给定一个包含电话号码列表(一行一个电话号码)的文本文件 file.txt,写一个 bash 脚本输出所有有效的电话号码. 你可以假设一个有效的电话号码必须满足以下两种格式: (xxx) xxx-xxx ...

  5. 2017ACM暑期多校联合训练 - Team 7 1009 HDU 6128 Inverse of sum (数学计算)

    题目链接 Problem Description There are n nonnegative integers a1-n which are less than p. HazelFan wants ...

  6. ASLR

    @author:dlive ASLR address space layout randomization 微软从windows vista/windows server 2008(kernel ve ...

  7. 目标检测-基于Pytorch实现Yolov3(1)- 搭建模型

    原文地址:https://www.cnblogs.com/jacklu/p/9853599.html 本人前段时间在T厂做了目标检测的项目,对一些目标检测框架也有了一定理解.其中Yolov3速度非常快 ...

  8. (转)USB体系结构

    转载地址:http://blog.ednchina.com/zenhuateng/203584/Message.aspx USB总线接口层:物理连接.电气信号环境.信息包传输机制:主机一方由USB主控 ...

  9. nginx与PHP的关系和交互方式【转】

    nginx与PHP的关系. 对比, apache和PHP的关系, 将PHP安装成apache的一个功能模块, 导致的结果, 对外只有一个apache程序, PHP并不独立出现, 仅仅是apache的模 ...

  10. VirtualBox与Genymotion命令行启动

    一.VirtualBox命令行启动 1.添加环境变量: %programfiles%\Oracle\VirtualBox 2.用VBoxManage查看已存在vmname|uuid命令: VBoxMa ...