wait(),notify(),notifyAll()三个方法不是Thread的方法,而是Object的方法。意味着所有对象都有这三个方法,因为每个对象都有锁,所以自然也都有操作锁的方法了。这三个方法最终调用的都是jvm级的native方法。随着jvm运行平台的不同可能有些许差异。

java文档的解释

wait导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。当前的线程必须拥有此对象监视器。该线程发布对此监视器的所有权并等待,直到其他线程通过调用 notify 方法,或 notifyAll 方法通知在此对象的监视器上等待的线程醒来。然后该线程将等到重新获得对监视器的所有权后才能继续执行.

  notify唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。直到当前的线程放弃此对象上的锁定,才能继续执行被唤醒的线程。此方法只应由作为此对象监视器的所有者的线程来调用.

  "当前的线程必须拥有此对象监视器"与"此方法只应由作为此对象监视器的所有者的线程来调用"说明wait方法与notify方法必须在同步块内执行,即synchronized(obj之内).

  调用对像wait方法后,当前线程释放对像锁,进入等待状态.直到其他线程(也只能是其他线程)通过notify 方法,或 notifyAll.该线程重新获得对像锁.

例子代码:

说明:线程运行3秒后调用wait等待,6秒后主线程调用notify唤醒等待线程。

 /**
* Created on 2016/1/31.
*/
public class MyThread implements Runnable {
private Object flag;
private String threadName; public MyThread(Object flag,String threadName) {
this.flag = flag;
this.threadName = threadName;
} @Override
public void run(){
try{
for(int i = 0; i < 10;i++){
if(i == 3){
synchronized (this.flag){
System.out.println("3秒后线程调用wait睡眠");
this.flag.wait();
}
}
System.out.println(this.threadName + " " + i);
Thread.sleep(1000);
}
} catch(InterruptedException e){
e.printStackTrace();
} }
}

main方法:

 import java.io.IOException;

 /**
* Created on 2016/1/31.
*/
public class TestMain {
public static void main(String[] args) {
Object object = new Object();
MyThread myThread1 = new MyThread(object,"thread1");
// MyThread myThread2 = new MyThread(object,"thread2");
Thread test1 = new Thread(myThread1);
test1.start(); // Thread test2 = new Thread(myThread1);
// test2.start(); try{
Thread.sleep(6000);
System.out.println("6秒后唤醒线程");
synchronized (object){
object.notify();
}
System.in.read();
} catch(InterruptedException e){
e.printStackTrace();
} catch(IOException e){
e.printStackTrace();
} }
}

结果:

测试notifyAll(MyThread代码不变)

main方法代码:

 import java.io.IOException;

 /**
* Created on 2016/1/31.
*/
public class TestMain {
public static void main(String[] args) {
Object object = new Object();
MyThread myThread1 = new MyThread(object,"thread1");
MyThread myThread2 = new MyThread(object,"thread2");
Thread test1 = new Thread(myThread1);
test1.start(); Thread test2 = new Thread(myThread2);
test2.start(); try{
Thread.sleep(6000);
System.out.println("6秒后唤醒线程");
synchronized (object){
object.notifyAll();
}
System.in.read();
} catch(InterruptedException e){
e.printStackTrace();
} catch(IOException e){
e.printStackTrace();
} }
}

结果截图:

java中的wait(),notify(),notifyAll(),synchronized方法的更多相关文章

  1. -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中

     本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁  sleep()和wait()方法的区别 为什么wait( ...

  2. Object中的wait,notify,notifyAll基本使用(转)

    让线程停止运行/睡眠的方法只有两个:Thread.sleep()或者obj.wait() 记住obj.nofity()并不能停止线程运行,因为notify虽然释放了锁,但依然会急促执行完synchro ...

  3. Java中的五种单例模式实现方法

    [代码] Java中的五种单例模式实现方法   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 2 ...

  4. java中获取日期和时间的方法总结

    1.获取当前时间,和某个时间进行比较.此时主要拿long型的时间值. 方法如下:  要使用 java.util.Date .获取当前时间的代码如下 Date date = new Date(); da ...

  5. java中遍历map对象的多种方法

    在Java中如何遍历Map对象   How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有ma ...

  6. java中常用的字符串的截取方法

    java中常用的字符串的截取方法   1.length() 字符串的长度 例:char chars[]={'a','b'.'c'}; String s=new String(chars); int l ...

  7. 谈谈java中遍历Map的几种方法

    java中的map遍历有多种方法,从最早的Iterator,到java5支持的foreach,再到java8 Lambda,让我们一起来看下具体的用法以及各自的优缺点 先初始化一个map public ...

  8. Java中产生随机数的两个方法

    Java中产生随机数的两个方法 一.利用random方法来生成Java随机数. 在Java语言中生成Java随机数相对来说比较简单,因为有一个现成的方法可以使用.在Math类中,Java语言提供了一个 ...

  9. Java中创建数组的几种方法

    Java中创建数组的几种方法 public static void main(String[] args) { //创建数组的第一种方法 int[] arr=new int[6]; int intVa ...

随机推荐

  1. Neutron 理解 (3): Open vSwitch + GRE/VxLAN 组网 [Netruon Open vSwitch + GRE/VxLAN Virutal Network]

    学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...

  2. Neutron 理解 (4): Neutron OVS OpenFlow 流表 和 L2 Population [Netruon OVS OpenFlow tables + L2 Population]

    学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...

  3. NYOJ---540奇怪的排序

    奇怪的排序 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描述 最近,Dr. Kong 新设计一个机器人Bill.这台机器人很聪明,会做许多事情.惟独对自然数的理解与人类不一 ...

  4. 蓝牙BLE传输性能及延迟分析

    BLE传输性能主要受以下几个因素影响:操作类型,Connection Interval,每个Connection Event内发送的帧数.每一帧数据的长度.具体参见如下链接: https://devz ...

  5. [No000084]C# 使用Log4Net(1)-快速建立一个demo

    1.下载Log4Net: http://logging.apache.org/log4net/download_log4net.cgi 2.新建一个WinForm程序,取名Log4NetDemo 3. ...

  6. php导出EXCEL方法

    // 将数据表导出成 csv 格式文件并下载 // @param string $data:要导出的数据 // @param array $del:不导出的字段名,指定的字段数据不被导出 // @pa ...

  7. 访问服务端的HttpProxy

    tip:加密部分暂时先注释掉 package com.zqc.share.manager.framework; import java.net.HttpURLConnection; import ja ...

  8. android第一行代码-3.activity之间的调用跟数据传递

    前面两节所有应用都是同一个activity中的,是时候讲activity之间交互的操作了,此后会涉及到intent这个概念,这也算一个新的里程碑开始. 主要内容包括intent的使用,以及activi ...

  9. Javascript:来一个AJAX封装函数

    前不久换工作了,最近一直在出差,忙得跟狗一样,所以博客都荒废许久了. 最近的工作中涉及到大量的ajax操作,本来该后台做的事也要我来做了.而现在使用的ajax函数是一个后台人员封装的—-但他又是基于 ...

  10. 【腾讯GAD暑期训练营游戏程序班】游戏中的物理系统作业说明文档

    一.需求分析• 添加一辆新NPC车,可以让其与主角车碰撞:• 添加一些新物件,能够与车互动,在其触发事件将其移除:• 添加一些无法撞动的事件:• 添加NPC车的自动移动逻辑:• 在课上赛车的示例上添加 ...