join()方法是Thread类的一个方法,而wait()、notify()、notifyAll()是java.lang.Object类的方法,这意味着,任何一个Java对象(包括线程对象)都有wait()、notify()、notifyAll()方法,但只有线程对象才有join()方法。

wait()方法

有两种格式:
格式1:public final void wait() throws InterruptedException
只有拥有该对象的“对象锁”的线程才能调用该对象的wait()方法。该方法的功能是,使调用者(线程)释放该“对象锁”,并进入“阻塞”状态,Java系统将这个调用者(线程)放入该对象的wait等待队列中。当另外一个线程调用该对象的notify()、notifyAll()方法时,唤醒处于这个对象的wait等待队列中的线程,进入运行态。线程唤醒后能否沿原来断点处继续执行,取决于该线程能否重新得到该对象的“对象锁”。若得不到对象锁,则根据synchronized的获取对象锁的机制,该线程将进入“阻塞”状态,并被放入该对象的对象锁等待队列中。当其他线程归还对象锁时会自动唤醒它。如前所述,另一个线程若调用该线程的interrupt()方法,将唤醒该线程,中断它的“阻塞”状态,进入“运行”态。但只有该线程重新获取到该对象的“对象锁”时,才会抛出InterruptedException异常给该线程。wait()方法使该线程只释放这个对象的对象锁并进入这个对象的wait等待队列中,若该线程同时还拥有其他对象的对象锁,这些对象锁不会被释放。释放对象锁的主要原因是尽可能降低产生线程间死锁的机率。

格式2:public final void wait(long timeout) throws InterruptedException
其中:timeout是毫秒。
含义同上。只增加了当指定的时间一到,线程被唤醒,进入运行态。然后线程试图重新获取对象锁。只有获取到对象锁,才能继续原先的断点往下执行。若timeout=0,则等同于wait()。
 
lnotify()notifyAll()方法

notify 的格式为:public final void notify()
只有拥有该对象的“对象锁”的线程才能调用该对象的notify()方法。该方法的功能是,从该对象的wait等待队列中选择一个线程唤醒它,选择的算法由具体实现者决定,可简单认为是从队列中任意选择一个线程。大部分情况下,wait()与notify()或notifyAll()是配套成对使用的。若对一个wait(),程序员忘记用相应的notify()或notifyAll()来唤醒,则极大地增加产生死锁的概率。
考虑到尽可能降低死锁产生的潜在可能性,通常建议使用notifyAll(),其格式为:public final void notifyAll()

(1) 必须保证,每一个wait()都有相应的notify()或notifyAll()。
(2) wait()/notify()/notifyAll()是任何一个Java对象都具有的方法,只有拥有该对象的对象锁的线程才能调用wait()/notify()/notifyAll()方法。
(3) wait()/notify()/notifyAll()方法必须且只能放在synchronized代码块或方法中,且wait()通常放在while()语句中。
(4) 线程A调用对象K的wait()方法进入对象K的等待队列时,只释放它所拥有的对象的锁,它所拥有的其他对象K的锁并不会释放。
若一个Java程序的所有线程都因为申请不到它们所需要的资源而全部进入“阻塞”状态时,该Java程序将被挂起,程序再不能继续前进,这种现象称为死锁。
 

JAVA--线程wait()、lnotify()和notifyAll()方法的更多相关文章

  1. java线程的简单实现及方法

    java线程: 线程是一个程序内部的顺序控制流. cpu实际上在一个时间点上,只执行一个.只不过我们把cpu分成了多个时间片,由于速度很快,我们看起来像是多个线程.. 就像你的时间分成几片,这样 整体 ...

  2. Java线程状态切换以及核心方法

    1.Java线程状态 1.1 线程主要状态 ①初始(NEW):新创建了一个线程对象,但还没有调用start()方法.②运行(RUNNABLE):Java线程中将就绪(ready)和运行中(runnin ...

  3. Java线程中yield与join方法的区别

    长期以来,多线程问题颇为受到面试官的青睐.虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用(在过去的七年中,我得到了一个机会),但是理解多线程对增加你的信心很有用.之前,我讨论了一个w ...

  4. java线程生命周期及其对应方法

    http://blog.sina.com.cn/s/blog_a8aa82cc0101ktrm.html http://wenku.baidu.com/view/c242df69011ca300a6c ...

  5. Java线程中run和start方法的区别

    http://bbs.csdn.net/topics/350206340 Thread类中run()和start()方法的区别如下:run()方法:在本线程内调用该Runnable对象的run()方法 ...

  6. Java线程池的正确关闭方法,awaitTermination还不够

    问题说明 今天发现了一个问题,颠覆了我之前对关闭线程池的认识. 一直以来,我坚信用shutdown + awaitTermination关闭线程池是最标准的方式. 不过,这次遇到的问题是,子线程用到B ...

  7. Java线程的三种实现方法

    Java多线程详解 线程简介 多任务,多线程 多任务情况中,虽然可以完成,但是实际上,多任务的完成是由一个一个小任务的完成来实现的,也就是说在执行多任务时,不是同时执行多个任务,而是一个时间段内只完成 ...

  8. 关于java线程锁synchronized修饰普通方法与静态方法的区别

    最近研究线程方面问题,关于这个synchronized锁修饰的问题,先是修饰普通方法,然后通过两个线程,各自执行自己对象的锁,发现方法执行互不影响,代码如下: private static int n ...

  9. java线程相关基本方法

    java线程中常用的基本方法有wait,notify,notifyAll,sleep,join,yield等. 线程的生命周期一共分为五个部分,分别是:新建(New).就绪(Runnable).运行( ...

随机推荐

  1. mysql 5.7.16多源复制

    演示一下在MySQL下搭建多主一从的过程. 实验环境: 192.168.24.129:3306 192.168.24.129:3307 192.168.24.129:3308 主库操作 导出数据 分别 ...

  2. 菜鸟的MySQL学习笔记(五)

    7.自定义函数 用户自定义函数(user-defined function,UDF)是一种对MySQL扩展的途径,其用法与内置函数相同.包含了两个必要条件,参数与返回值.没有必然内在联系. 函数可以返 ...

  3. 【python】python的二元表达式和三元表达式

    二元表达式 x,y=4,3if x>y: s = yelse: s= x print s   x if x<y else y 三元表达式: >>> def f(x,y): ...

  4. Pyhon编码事项

    1. 永远不要使用import * Pylint代码审查:Wildcard import XXX 如果函数名重名,或者要导入的内容里面包含了from datetime import datetime, ...

  5. 两台主机打通ssh

    ssh打通基本概念:如果需要通过SSH进行远程登录,我们一般是需要手动输入密码,但如果将SSH之间的权限打通的话,就可以实现无密码登录.这对shell脚本的定时执行有很大的帮助. (一),生成秘钥,先 ...

  6. simhash--文本排重

    转载自 https://github.com/julycoding/The-Art-Of-Programming-By-July/blob/master/ebook/zh/06.12.md http: ...

  7. Session里的对象是不可靠的!

    最近在做Database课程的final project,foodiePharos, 重新认识了JSP里容易出现的一些问题. 比如我们这个项目使用了JPA,就涉及到entity对象的状态问题,Enti ...

  8. HTML5 Geolocation

    http://diveintohtml5.info/geolocation.html http://msdn.microsoft.com/en-us/library/windows/apps/hh44 ...

  9. CRC算法及C实现

    一.CRC算法原理   CRC校验的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校 验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数 ...

  10. [OJ] Insert Interval

    LintCode #30. Insert Interval (Easy) LeetCode #57. Insert Interval (Hard) class Solution { public: v ...