感谢博主:http://zy19982004.iteye.com/blog/1626916 这篇博文给予我线程知识很大的帮助

知识背景:(1)wait()、notify()均是Object的方法,故每个对象都拥有这2个方法。

     (2)obj.wait、obj.notify必须在synchronized(obj){}代码块内部使用

     (3)obj.wait会抛异常,obj.notify没有异常抛出

     (4)2个线程同时运行,线程1执行到obj.wait()代码时,线程阻塞,释放对象锁;线程2拿到对象锁,线程2执行到obj.notify()代码时,唤醒线程1,线程1进入锁池,此时线程2并未释放对象锁,代码继            续obj.notify()往下走,走完synchronized代码块后,线程2释放对象锁;线程2进入锁池中与线程1一起参与资源(对象锁)争抢。

     (5)下面的例子中,如果线程1(生产者)obj.notify();代码注释掉,会出现线程死锁。原因:线程2执行到obj.wait(),线程2进入等待队列中;线程1,拿到对象锁,走完代码块,因为线程2还是等待,线程1一定拿到对象锁,然后执行了obj.wait();2个线程都等待了,线程死锁。

class Info {private String name;private String content;private boolean flag;public boolean isFlag() {return flag;}public void setFlag(boolean flag) {this.flag = flag;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}
}
class Producer implements Runnable {private Info info;public Producer(Info info) {this.info = info;}@Overridepublic void run() {try {Thread.sleep(5000);} catch (InterruptedException e1) {e1.printStackTrace();}boolean flag = false;for (int i = 0; i < 10; i++) {if (!flag) {synchronized (info) {if (info.isFlag()) {try {System.out.println("有产品(MLDN),生产者等待消费....");info.wait();} catch (InterruptedException e) {e.printStackTrace();}}this.info.setName("李兴华");try {Thread.sleep(90);} catch (InterruptedException e) {e.printStackTrace();}this.info.setContent("教学老师 + " + i);flag = true;info.setFlag(true);System.out.println("set()--李兴华&&java讲师 flag="+ info.isFlag());info.notify();}} else {synchronized (info) {if (info.isFlag()) {try {System.out.println("有产品(李兴华),生产者等待消费....");info.wait();} catch (InterruptedException e) {e.printStackTrace();}}this.info.setName("MLDN");try {Thread.sleep(90);} catch (InterruptedException e) {e.printStackTrace();}this.info.setContent("WWW.MLDN.CN + " + i);flag = false;info.setFlag(true);System.out.println("set()--MLDN&&WWW.MLDN.CN flag="+ info.isFlag());info.notify();}}}}
}
class Consumer implements Runnable {private Info info;public Consumer(Info info) {this.info = info;}@Overridepublic void run() {for (int i = 0; i < 10; i++) {try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}synchronized (info) {if (!info.isFlag()) {try {System.out.println("没有产品,等待生产....");info.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.print(this.info.getName() + "————>");try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(this.info.getContent() + "--" + i);info.setFlag(false);info.notify();}}}
}
public class Test_producer_consumer {public static void main(String[] args) {Info info = new Info();Producer p = new Producer(info);Consumer c = new Consumer(info);Thread t1 = new Thread(p, "p");Thread t2 = new Thread(c, "c");t1.start();t2.start();}
}

结果有上面2种,第一种,当线程1运行到obj.notify();//a处,线程2被唤醒,线程2进入竞争obj对象的锁池。线程1执行完synchronized代码块后,释放对象锁;如果线程1不再参与对象锁的竞争那么结果2中的情况不会发生;但是结果2发生了,线程1再一次拿到对象锁,然后执行到obj.wait()方法后,释放对象锁,线程1进入阻塞状态,线程2获得对象锁。

这个结果是去掉消费者Thread.sleep(5000);得到的一种结果。2个1出现说明,线程1调用obj.notify()后,线程1再一次参与了对象锁的竞争,并且获得到了。

转载于:https://www.cnblogs.com/jiaqingblog/p/6278291.html

Thread线程notify方法的自我理解相关推荐

  1. Vector的使用方法和自我理解

    vector容器的作用,在于你在储存一些数的时候,可以很方便的改变他的大小,利用下标可以同数组一样轻松的遍历,却比数组强的是:vector可以删去不用的元素,已达到我们获取前一个数值: 1 基本操作( ...

  2. Java线程的挂起与恢复 wait(), notify()方法介绍

    一, 什么是线程的挂起与恢复 从字面理解也很简单. 所谓线程挂起就是指暂停线程的执行(阻塞状态). 而恢复时就是让暂停的线程得以继续执行.(返回就绪状态) 二, 为何需要挂起和恢复线程. 我们来看1个 ...

  3. Java并发07:Thread的基本方法(4)-Thread.sleep()、Object.wait()、notify()和notifyAll()

    [超级链接:Java并发学习系列-绪论] 本章主要对Java中Thread类的基本方法进行学习. 1.序言 Thread类作为线程的基类,提供了一系列方法,主要有: Thread.sleep(long ...

  4. Thread线程从零认识到深层理解——初识

    线程系列目录 Thread线程从零认识到深层理解--初识 Thread线程从零认识到深层理解--六大状态 Thread线程从零认识到深层理解--wait()与notify() Thread线程从零认识 ...

  5. 线程和进程/阻塞和挂起以及那些sleep,wait()和notify()方法详解

    线程与进程的阻塞 线程阻塞 线程在运行的过程中因为某些原因而发生阻塞,阻塞状态的线程的特点是:该线程放弃CPU的使用,暂停运行,只有等到导致阻塞的原因消除之后才回复运行,或者是被其他的线程中断,该线程 ...

  6. 线程的状态转换、sleep()、wait()、yeild()、终止线程的方法、线程之间的协作(join()、wait() notify() notifyAll()、await() signal() )

    1.线程的状态转换 1.1 新建(New) 创建后尚未启动 1.2 可运行(Runnable) 可能正在运行,也可能正在等待 CPU 时间片. 包含了操作系统线程状态中的 Running 和 Read ...

  7. java thread.notify_Java Thread notify()方法

    Thread类的notify()方法用于唤醒单个线程. 此方法仅为一个等待特定对象的线程提供通知. 如果使用notify()方法并且有多个线程正在等待通知,那么只有一个线程获得通知,而剩下的线程必须等 ...

  8. java 线程的构造函数_深入理解Thread构造函数

    本文参考汪文君著:Java高并发编程详解. 1.线程的命名 在构造现成的时候可以为线程起一个名字.但是我们如果不给线程起名字,那线程会有一个怎样的命名呢? 这里我们看一下Thread的源代码: pub ...

  9. 线程wait和notify方法

    一.等待和通知 wait和notify也是为了处理线程调度随机性的问题的,但是这个随机性不太好,还是需要让彼此之间有一个固定的顺序的,join也是一种控制顺序的方式,更倾向于控制线程结束,也是有局限性 ...

最新文章

  1. 开启Office 2003出现要安装PRO11.MSI解决方法 (zhuan)
  2. 可视化GDI操作题目
  3. Spring-Bean的依赖注入分析-01
  4. loj10165. 「一本通 5.3 例 3」Windy 数
  5. IOS UIScrollView 滚动视图的使用和文档
  6. 突破技术界限,FVS大屏编辑模式,真正让大屏做到所见即所得
  7. APAC SharePoint Conference 2007 讲义与资源下载
  8. 页面间传值的新思路--PreviousPage
  9. spring学习--引入外部文件,初始化属性
  10. java编程题50道
  11. 当独孤求败遇见东方不败
  12. 幼儿 Android App,中国幼儿园在线app
  13. 接口和接口测试以及测试工具
  14. 小学五年级计算机课评课,小学数学五年级下册公开课《分数的意义》听课心得体会评课稿...
  15. 【二分】C. Keshi Is Throwing a Party
  16. H5企业网站模板:蓝绿过渡色功能菜单齐全企业网站模板
  17. 前端工程师初识Three.js
  18. windows下的EPS格式文件查看工具EPS Viewer
  19. CAD技巧之002——如何用Cass内插高程点或者说加密高程点
  20. FDA认证咨询,委托实验室或者生产厂家必须进行抑菌/抑真菌测试。

热门文章

  1. AcWing 9. 分组背包问题(分组背包模板)
  2. java xml类型_java 解析String类型的xml
  3. 判断mos管好坏_想要保护电动车控制器,推荐这款STP75NF75高压MOS管
  4. Transformer、BERT等模型学习笔记
  5. [HAOI2011]Problem b BZOJ2301 数学
  6. [Lydsy1805月赛]对称数 BZOJ5361
  7. for of 与 for in的区别
  8. 深度学习框架中的魔鬼:探究人工智能系统中的安全问题
  9. 软件架构师常会用到的几款软件
  10. javascript中引号嵌套