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. ubuntu下怎么合并windows下分割的zip包

    cat ziptest.z* > google_bak.zip 点击打开链接http://blog.51yip.com/linux/988.html

  2. 网站开发常用jQuery插件总结(12)固定元素插件scrolltofixed

    这个插件在前段时间用过一次,当时是改一个网站.要求顶部的菜单栏随着滚动条的滚动而固定.也大体写了一下,不过在文章中也只是提了一下,文章地址:jQuery插件固定元素位置. 在这篇文章中,再进行总结一下 ...

  3. 如何在Html的div+css中去除<li>标签前面小黑点,和ul、LI部分属性方法

    div是很多人做网站都会用到的,但在显示效果时前面总是会有一个小黑点,这个效果很多人不想要,但又不知到如何去除,然而我们可以用以下方法来清除. 1.在CSS中写入代码.找到相关性的CSS,在..li和 ...

  4. Python 集合(set)使用

    1.python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交), difference(差 ...

  5. python【第二十一篇】Django模板继承、分页、cookie验证

    1.模板继承 母版master.html {% block title %}{% endblock %}2 {% block table-cont %}{% endblock %} 子板 {% ext ...

  6. utube视频落地

    utube视频落地 简单粗暴的方法: 利用视频下载网站的网页版进行处理. 比如需要下载的视频的url是vid_url, 需要用到的web服务的url是web_service vid_url='http ...

  7. 寡人写的第一个HTML5页面

    好吧,其实是抄来的 <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"/> &l ...

  8. LightOj_1287 Where to Run

    题目链接 题意: 有n个街口和m条街道, 你后边跟着警察,你需要进行大逃亡(又是大爱的抢银行啊),在每个街口你都有≥1个选择, 1)停留在原地5分钟. 2)如果这个街口可以到xi这个街口, 并且, 通 ...

  9. DEEP LEARNING IS THE FUTURE: Q&A WITH NAVEEN RAO OF NERVANA SYSTEMS

    DEEP LEARNING IS THE FUTURE: Q&A WITH NAVEEN RAO OF NERVANA SYSTEMS CME Group was one of several ...

  10. 批量建立EXCHANGE邮件帐号建立三部曲

    第一步:从AD里导出用户名(可以基于OU),将输出的CSV的DN列删除,并去除可能的测试及其它用途用户名. csvde -f users-gz.csv -d "ou=MKT gz,dc=xm ...