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. tp_shop解读1

    由于想弄一个商城,因此研究了一下tp_shop,这个据说能完成几乎所有的功能. 考虑到原有的例子过于复杂,因此把所有相关的数据都删除了,结果上来就出错了,查了两天,大致弄清楚了状况. 关于错误的原因 ...

  2. PAT 1065 A+B and C (64bit) (20)

    1065. A+B and C (64bit) (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 HOU, Qiming G ...

  3. javascript tab onclick

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org ...

  4. 【转】oracle null

    转自:oracle的null和空字符串'' 1.oracle 将 空字符串即''当成null 2.null 与任何值做逻辑运算得结果都为 false,包括和null本身 3.用 is null 判断时 ...

  5. linux下安装phpredis

    一.redis安装 1. yum install redis (不行的先执行:yum install epel-release,再yum install redis) 2.启动服务 redis-ser ...

  6. PHP用memcached做实时分页

    用memcached做分页缓存,可能很多人会觉得麻烦而不用.因为在增加.修改.删除的过程中,你不知道会影响到哪些数据,而如果把所有分页相关的数据缓存都删除并重新生成一遍,实现又很麻烦,甚至不可行,所以 ...

  7. Oracle安装时忘记解锁scott用户的解决方案

    最近笔者开始学习Oracle,对于笔者同学安装过程出现各种问题而导致重做系统表示默哀. (1)问题1:64位操作系统安装完以后选择java.exe文件后.sqldeveloper闪退,原因是64位操作 ...

  8. HTML 页面加载动画效果

    浏览器:Chrome, IE <!doctype html> <html> <head> <title>CSS transform: CSS only ...

  9. Windows使用Apache2配置Git服务器

    Windows使用Apache2配置Git服务器 本文地址:http://www.cnblogs.com/cnscoo/p/3373095.html Git下载: 网站:https://code.go ...

  10. bzoj3667: Rabin-Miller算法

    Description   Input 第一行:CAS,代表数据组数(不大于350),以下CAS行,每行一个数字,保证在64位长整形范围内,并且没有负数.你需要对于每个数字:第一,检验是否是质数,是质 ...