wait/notify:

wait()使线程停止,notify使wait状态的线程继续执行。

wait()是Object类的方法,该方法用来将线程置入“预执行队列”,并在wait()方法处停止执行,直到接到通知或被中断为止。调用wait()方法必须要获得对象的锁,即只能在同步方法或同步块中调用wait()方法。调用wait()方法后,对象的锁被当前线程释放。

notify()也是在同步块或同步方法中调用,调用前必须获得对象的锁,该方法用来通知那些等待该对象的锁的其它线程。如果有多个线程等待,则挑选一个wait()状态线程,对其发出通知,如果没有线程等待,则该命令被忽略。在该notify()方法所在的synchronized块或方法执行完毕后,才使被挑选的线程获取该对象的锁。

注意:如果调用wait() 或notify() 没有持有对象的锁,会抛出IlegalMonitorStateException异常。

 package multiMethod.waitNotify;

 import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger; public class MyList {
private List<String> list = new LinkedList<String>();
private AtomicInteger count = new AtomicInteger(0);
private int maxSize, minSize;
private Object lock = new Object(); public MyList(int maxSize, int minSize) {
this.maxSize = maxSize;
this.minSize = minSize;
} public void add() {
synchronized (lock) {
try {
if (getSize() == maxSize) {
lock.wait();
}
} catch (Exception e) {
}
list.add("hello");
System.out.println("add ...");
count.incrementAndGet();
lock.notify();
}
} public void take() {
synchronized (lock) {
try {
if (getSize() <= minSize) {
lock.wait();
}
} catch (Exception e) {
// TODO: handle exception
}
list.remove(count.get()-1);
System.out.println("take().......");
this.count.decrementAndGet();
lock.notify();
}
} public int getSize() {
return count.get();
} public static void main(String[] args) {
MyList queue = new MyList(6, 3);
Thread threadA = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
queue.add();
}
}
});
Thread threadB = new Thread(new Runnable() { @Override
public void run() {
while (true) {
queue.take();
}
}
}); Thread threadC = new Thread(new Runnable() { @Override
public void run() {
while (true) {
System.out.println((queue.count));
}
}
}); threadB.start();
threadA.start();
threadC.start();
}
}

每个锁对象有两个队列,一个就绪队列,一个阻塞队列。就绪队列中线程已被唤醒,等待获得cpu,阻塞队列执行了wait(),等待被唤醒。

需要注意的是:

1. notify()通知过早,线程不会被唤醒,因为wait()后于notify()执行。

2. wait等待条件发生了变化,线程也不会被唤醒。

3. 唤醒同类,线程陷入假死。如:生产者唤醒生产者,消费者唤醒消费者。

1 wait notify的更多相关文章

  1. Thread Object wait() notify()基本

    package com.thread.test.thread; import java.util.ArrayDeque; import java.util.Queue; import java.uti ...

  2. 如何在 Java 中正确使用 wait, notify 和 notifyAll(转)

    wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视.本文对这些关键字的使用进行了描述. 在 Java 中可以用 wait ...

  3. java多线程wait notify join

    wait notify 几个注意点: wait 与 notify/notifyAll 方法必须在同步代码块中使用,即要先对调用对象加锁. 当线程执行wait()时,会把当前的锁释放,然后让出CPU,进 ...

  4. 【Java并发系列02】Object的wait()、notify()、notifyAll()方法使用

    一.前言 对于并发编程而言,除了Thread以外,对Object对象的wati和notify对象也应该深入了解其用法,虽然知识点不多. 二.线程安全基本知识 首先应该记住以下基本点,先背下来也无妨: ...

  5. 【多线程】java多线程 测试例子 详解wait() sleep() notify() start() join()方法 等

    java实现多线程,有两种方法: 1>实现多线程,继承Thread,资源不能共享 2>实现多线程  实现Runnable接口,可以实现资源共享 *wait()方法 在哪个线程中调用 则当前 ...

  6. #研发中间件介绍#异步消息可靠推送Notify

    郑昀 基于朱传志的设计文档 最后更新于2014/11/11 关键词:异步消息.订阅者集群.可伸缩.Push模式.Pull模式 本文档适用人员:研发   电商系统为什么需要 NotifyServer? ...

  7. 线程同步以及 yield() wait()和notify()、notifyAll()

    1.yield() 该方法与sleep()类似,只是不能由用户指定暂停多长时间,并且yield()方法只能让同优先级的线程有执行的机会. 2.wait()和notify().notifyAll() 这 ...

  8. java 多线程之wait(),notify,notifyAll(),yield()

    wait(),notify(),notifyAll()不属于Thread类,而是属于Object基础类,也就是说每个对像都有wait(),notify(),notifyAll()的功能.因为都个对像都 ...

  9. wait、notify、sleep、interrupt对比分析

    对比分析Java中的各个线程相关的wait().notify().sleep().interrupt()方法 方法简述 Thread类 sleep:暂停当前正在执行的线程:(类方法) yield:暂停 ...

  10. java中的wait(),notify(),notifyAll(),synchronized方法

    wait(),notify(),notifyAll()三个方法不是Thread的方法,而是Object的方法.意味着所有对象都有这三个方法,因为每个对象都有锁,所以自然也都有操作锁的方法了.这三个方法 ...

随机推荐

  1. Advanced Plugin Concepts

    Provide Public Access to Default Plugin Settings An improvement we can, and should, make to the code ...

  2. ssm调用后台oracle存储过程统计分析数据

    笔者所在项目需要一个统计本机构近6月收入情况(分两种).本机构下级机构收入情况的需求,数据量为百万级. 具体需求是时间.机构都不确定,可为入参. 综合考虑后决定使用后台存储过程统计. 基础表结构如下: ...

  3. Oracle作业3 —— 简单查询

    一.创建学生表 CREATE TABLE STUDENTS( STU_ID ) CONSTRAINTS PK_STUS_ID PRIMARY KEY, STU_NAME ) NOT NULL, STU ...

  4. 如何编写及运行JS

    JS也是一种脚本语言,他可以有两种方式在HTML页面进行引入,一种是外联,一种是内部.       外联JS的写法为: <script src="相对路径"></ ...

  5. Springmvc+Spring+Mybatis整合开发(架构搭建)

    Springmvc+Spring+Mybatis整合开发(架构搭建) 0.项目结构 Springmvc:web层 Spring:对象的容器 Mybatis:数据库持久化操作 1.导入所有需要的jar包 ...

  6. idea 引入多项目

    1.先导入总包 2.右侧mavenmaven,选择parent的pom.xml 3.右上角“Project Structure”检查SDK

  7. Dubbo 安装监控中心

    一.Dubbo 安装服务管理控制台 1.在官方Github下载Dubbo OPS 2.下载incubator-dubbo-ops源码后,解压修改配置文件Zookeeper注册中心地址 3.maven打 ...

  8. Angular.js进阶

    1.常用指令 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UT ...

  9. 在IOS端点击数字后会调起系统拨号界面

    在IOS端点击数字后会调起系统拨号界面,解决方案: <meta name="format-detection" content="telephone=no" ...

  10. 解决 Node.js 错误 Error:listen EADDRINUSE

    第一次尝试 node.js 中的 express 框架,写了第一个 js 文件之后,在 WebStorm 运行,到游览器刷新,成功运行. 又创建一个 js 文件,写的是静态路由的访问,结果出现了 Er ...