ynchronized让线程之间互斥,但是有时候因为业务逻辑,需要主动释放锁,让其它的线程执行,这就需要线程之间通信,我们知道JAVA里每个对象都有个隐式锁,JAVA为每个对象都提供了wait和notify(还有notifyAll)方法,分别用于本线程主动释放锁,进入等待状态,和唤醒其它进入等待的线程。

官方解释:

Causes the current thread to wait until another thread invokes the java.lang.Object.notify() method or the java.lang.Object.notifyAll() method for this object.

wait会导致当前线程进入等待,直到其它线程执行该对象的notify()或者notifyAll方法

The current thread must own this object’s monitor. The thread releases ownership of this monitor and waits until another thread notifies threads waiting on this object’s monitor to wake up either through a call to the notify method or the notifyAll method. The thread then waits until it can re-obtain ownership of the monitor and resumes execution.

首先当前线程在调用wait之前,必须先获取到该对象的monitor就是所谓的隐式锁,也就是synchronized的作用。这个线程就会释放对隐式锁,并且进入等待,直到另外一个获得锁的线程,通过notify和notifyAll唤醒它。它在被唤醒后,并不会继续往下执行,而是需要再次去获取锁,获取锁之后,继续执行。

也就是说wait和notify(notifyAll)方法必须是在一个线程获取了该对象的隐式锁的情况下,即在synchronized方法,或者synchronized代码段里面,才可以调用,否则就会报错IllegalMonitorStateException – if the current thread is not the owner of this object’s monitor.

实例:

public class LockObject

{

public static void main(String[] args)

throws InterruptedException

{

final LockObject lock = new LockObject();

new Thread()

{

@Override

public void run()

{

System.err.println("线程一执行");

synchronized(lock)

{

try

{

System.err.println("线程一进入");

sleep(3000);

System.err.println("线程一睡眠结束");

lock.wait();

System.err.println("线程一执行结束");

}

catch (InterruptedException e)

{

e.printStackTrace();

}

}

}

}.start();;

Thread.sleep(1000);

new Thread()

{

@Override

public void run()

{

System.err.println("线程二执行");

synchronized(lock)

{

try

{

System.err.println("线程二进入");

sleep(3000);

System.err.println("线程二睡眠结束");

lock.notify();

System.err.println("线程二通知别人醒来");

sleep(2000);

System.err.println("线程二执行结束");

}

catch (InterruptedException e)

{

e.printStackTrace();

}

}

}

}.start();

}

}

输出:

线程一执行

线程一进入

线程二执行

线程一睡眠结束

线程二进入

线程二睡眠结束

线程二通知别人醒来

线程二执行结束

线程一执行结束

解释:

首先进入线程一,synchronized(lock)让其获取lock的隐式锁,线程二阻塞。

当线程一直线到wait的时候,释放锁, 线程二获取锁开始进入。

当线程二直线到notify执行之后,线程一被唤醒。

但是线程一还无法继续往下执行,因为它要重新获取锁,目前锁还被线程二所有,当线程二结束之后,释放锁,线程一重新得到锁,执行结束。

备注:

还有void wait(long timeout)方法,可以让线程在wait多少毫秒之后自助唤醒。

还有notifyAll()方法,用于三个或者以上个线程,多线程等待的情况,notifyAll用于唤醒所有wait的线程,notify只唤醒其中的某一个线程。

java线程wait_java多线程学习(四) 之 wait和notify相关推荐

  1. C#多线程学习(四) 多线程的自动管理(线程池) (转载系列)——继续搜索引擎研究...

    在多线程的程序中,经常会出现两种情况: 一种情况:   应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应                   这一般使用ThreadPo ...

  2. java修炼之多线程学习心得

    java修炼之多线程学习心得 java是少数几种支持"多线程"的开发语言之一.大多数的程序语言只能遵循运行单独的一个程序块,无法同时运行多个不同的程序块.java的"多线 ...

  3. java线程之基础学习

    java线程之基础学习总结 线程实现的两种方式: 在java中可以有两种方式实现多线程操作,一种是继承Thread类,另外一种是实现Runnable接口. 继承Thread类 Thread类是在jav ...

  4. java 编程思想 多线程学习笔记

    java 编程思想 多线程学习笔记 一.如何创建多线程? 1.继承 java.lang.Thread 类 2.实现 java.lang.Runnable 接口 3.Callable接口 总之,在任何线 ...

  5. java线程池多线程优先级_Java线程优先级

    java线程池多线程优先级 Priority of a thread describes how early it gets execution and selected by the thread ...

  6. java丐帮_java多线程学习笔记(四)

    上一节讲到Synchronized关键字,synchronized上锁的区域:对象锁=方法锁/类锁 本节补充介绍一下synchronized锁重入: 关键字synchronized拥有锁重入的功能,也 ...

  7. java线程阻塞唤醒的四种方式

    java在多线程情况下,经常会使用到线程的阻塞与唤醒,这里就为大家简单介绍一下以下几种阻塞/唤醒方式与区别,不做详细的介绍与代码分析 suspend与resume Java废弃 suspend() 去 ...

  8. Java 线程池原理及四种常用的线程池使用

    推荐阅读:Java线程池实现原理及其在美团业务中的实践 文章目录 什么是线程池 使用线程池的好处 线程池的实现原理 流程图分析 源码分析 线程池的使用 向线程池中提交任务 newCachedThrea ...

  9. 线程池---多线程学习笔记(三)

    线程池产生原因: 创建很多线程造成的两个问题: 1.构建一个新的线程会涉及到与操作系统的交互,会消耗一定的系统资源,当使用完这些新创建的线程后,线程就会被销毁,然后当我们再创建的时候就会再次消耗系统资 ...

最新文章

  1. 全国计算机等级考试一级ps考试试题,计算机等级考试一级ps考前试题及答案
  2. Dell在CRM的创新及该模式的推广
  3. 用python中django创建网页终端直接关闭是什么问题_如何用Python Django创建网站?系列文章03(持续更新...)...
  4. 专利交底书模板_工大知识产权周 | 不说套话,看完这篇get专利技术交底书的要点!...
  5. v-distpicker 一个好用的三级联动的插件
  6. html5 js贪吃蛇,html5+js 贪吃蛇
  7. LeetCode 375. 猜数字大小 II
  8. eclipse各种操作汇总
  9. Python爬虫实战之解密HTML
  10. Find the median(线段树离散化+区间更新)
  11. 关于CVE-2020-14882,你需要知道的都在这里
  12. 判断linux下的网络服务是否正常启动
  13. 算法 c语言实现 英文版 pdf,数据结构与算法分析++C语言描述++英文版++..pdf-得力文库...
  14. python调用通达信数据_通达信数据格式及5分钟信息提取
  15. 安装 macbook 双系统( OS X 和 Ubuntu )
  16. 制度化规范化标准化精细化_何为规范化、标准化、精细化管理
  17. 一个亿万富翁利用商城软件白手起家的故事
  18. 苹果4怎么越狱_来看iPhone迁移怎么用 除iOS12.4苹果还为旧款设备推送了更新
  19. PM_01 信息化和信息系统
  20. 数据结构之链表(java语言实现)

热门文章

  1. 这个VS Code扩展可以自动生成Python文档字符串
  2. 如何将 AI 应用于高考?辽宁使用 AI 技术进行高考违规行为异常检测!
  3. Linux 这些工具堪称神器!
  4. 【每日一算法】对称二叉树
  5. 你会去创建一个线程去处理压缩日志并删除吗?
  6. Django源码分析10:makemigrations命令概述
  7. 文本预处理的基本方法(分词、词性标注、命名实体识别)
  8. RESTful之排序
  9. 自然语言处理(NLP)之依存句法分析的可视化及图分析
  10. 什么是形参与实参,下面的回答很好!