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基本使用

    sudo nautilus xxx指定目录去打开 这个命令就是以root权限打开一个窗口,来管理文件

  2. linux进程间通信--有名管道

    有名管道 只有当一个库函数失败时,errno才会被设置.当函数成功运行时,errno的值不会被修改.这意味着我们不能通过测试errno的值来判断是否有错误存在.反之,只有当被调用的函数提示有错误发生时 ...

  3. yii2源码学习笔记(十二)

    继续了解controller基类. /** * Runs a request specified in terms of a route.在路径中指定的请求. * The route can be e ...

  4. 由css属性:vertial-align想到的。。

    我的笔记本:型号 acer4750G-2412g50mnkk 分辨率:1333*768,点距:0.25933mm; 12px下的font-size: 默认line-height减去font-size: ...

  5. Leaflet学习笔记-基础内容

    为什么选择Leaflet 开源,且代码仅有 31 KB,但它具有开发人员开发在线地图的大部分功能(80%的功能) 是不是比arcgis要小很多呢 官网:http://leafletjs.com/ 劣势 ...

  6. 除了判断语句if switch 我们还可以怎么做?-b

    之前项目中有根据后台数据执行不同代码,根据不同的字符串返回不同UIViewController对象,最开始需要的vc 种类不多我用的是if else 做字符串比较再执行不同代码,但是如果需求的vc 有 ...

  7. 多个div独立控制其显示/隐藏

    今天要说一个神奇的html标签op,静态页下可以配合jquery分别控制每个层的显示/隐藏切换. 如果用动态中使用,用文章id做区分就可以了. <html> <head> &l ...

  8. SQL Server强制删除复制发布

    原文地址:http://blog.csdn.net/leamonjxl/article/details/7352208 SQL Server 中 存在以前(系统还原前)的发布内容,使用鼠标->右 ...

  9. BZOJ 1642: [Usaco2007 Nov]Milking Time 挤奶时间

    Description 贝茜是一只非常努力工作的奶牛,她总是专注于提高自己的产量.为了产更多的奶,她预计好了接下来的N (1 ≤ N ≤ 1,000,000)个小时,标记为0..N-1. Farmer ...

  10. Ubuntu开机自动挂载Windows分区

    转自Ubuntu 12.04开机自动挂载Windows分区 1.查看系统磁盘号 sd2,sd5,sd7分别对应我windows的C,D,F盘,也是本次要添加到开机挂载的,E盘为wubi安装盘. 2.查 ...