1 wait notify
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的更多相关文章
- Thread Object wait() notify()基本
		package com.thread.test.thread; import java.util.ArrayDeque; import java.util.Queue; import java.uti ... 
- 如何在 Java 中正确使用 wait, notify 和 notifyAll(转)
		wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视.本文对这些关键字的使用进行了描述. 在 Java 中可以用 wait ... 
- java多线程wait notify join
		wait notify 几个注意点: wait 与 notify/notifyAll 方法必须在同步代码块中使用,即要先对调用对象加锁. 当线程执行wait()时,会把当前的锁释放,然后让出CPU,进 ... 
- 【Java并发系列02】Object的wait()、notify()、notifyAll()方法使用
		一.前言 对于并发编程而言,除了Thread以外,对Object对象的wati和notify对象也应该深入了解其用法,虽然知识点不多. 二.线程安全基本知识 首先应该记住以下基本点,先背下来也无妨: ... 
- 【多线程】java多线程  测试例子  详解wait()  sleep()  notify()   start()   join()方法 等
		java实现多线程,有两种方法: 1>实现多线程,继承Thread,资源不能共享 2>实现多线程 实现Runnable接口,可以实现资源共享 *wait()方法 在哪个线程中调用 则当前 ... 
- #研发中间件介绍#异步消息可靠推送Notify
		郑昀 基于朱传志的设计文档 最后更新于2014/11/11 关键词:异步消息.订阅者集群.可伸缩.Push模式.Pull模式 本文档适用人员:研发 电商系统为什么需要 NotifyServer? ... 
- 线程同步以及 yield() wait()和notify()、notifyAll()
		1.yield() 该方法与sleep()类似,只是不能由用户指定暂停多长时间,并且yield()方法只能让同优先级的线程有执行的机会. 2.wait()和notify().notifyAll() 这 ... 
- java 多线程之wait(),notify,notifyAll(),yield()
		wait(),notify(),notifyAll()不属于Thread类,而是属于Object基础类,也就是说每个对像都有wait(),notify(),notifyAll()的功能.因为都个对像都 ... 
- wait、notify、sleep、interrupt对比分析
		对比分析Java中的各个线程相关的wait().notify().sleep().interrupt()方法 方法简述 Thread类 sleep:暂停当前正在执行的线程:(类方法) yield:暂停 ... 
- java中的wait(),notify(),notifyAll(),synchronized方法
		wait(),notify(),notifyAll()三个方法不是Thread的方法,而是Object的方法.意味着所有对象都有这三个方法,因为每个对象都有锁,所以自然也都有操作锁的方法了.这三个方法 ... 
随机推荐
- js浮点型,整型操作方法汇总(进行中)
			浮点数操作方法如下: 1. Math.ceil()用作向上取整.(ceil 天花板) 2. Math.floor()用作向下取整. (floor 地板) (js 中取整底层原理是位运算的取反~运算,运 ... 
- 2018 Wannafly summer camp Day8--连通块计数
			连通块计数 描述 题目描述: 小 A 有一棵长的很奇怪的树,他由 n 条链和 1 个点作为根构成,第 i条链有 ai 个点,每一条链的一端都与根结点相连. 现在小 A 想知道,这棵长得奇怪的树有多少 ... 
- window下pip install Scrapy报错解决方案
			1.首先打开https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted,找到对应版本的Twisted并下载到你的文件夹. 2.利用pip install命令 ... 
- Linux 学习第六天
			一.VIM 1.VIM编辑器 1.1.VIM工作模式 1.1.1.命令模式:复制.剪切.粘贴.搜索等等 1.1.2.输入模式:随意对文件进行内容编辑 1.1.3.末行模式(:):保存退出,编辑环境设置 ... 
- 编译升级至openssh7.6
			1.概述 目的:下载源码包(https://openbsd.hk/pub/OpenBSD/OpenSSH/portable/openssh-7.6p1.tar.gz),编译升级为openssh为7.6 ... 
- HTML5之特效
			2D转换 在二维的平面上做一些变化,使用transform属性 1. 2D转换之移动(translate) 案例: div{ width: 200px; height: 200px; backgrou ... 
- HTML5中的拖拽与拖放(drag&&drop)
			1.drag 当拖动某个元素时,将会依次触发下列事件: 1)dragstart:按下鼠标键并开始移动鼠标时,会触发该事件 2)drag:dragstart触发后,随即便触发drag事件,而且在元素被拖 ... 
- laravel4.2  union联合,join关联分组查询最新记录时,查询条件不对,解决方案
			需求: 分组联合查询,或者最新记录. 问题: mysql分组的时候默认会查询第一条记录,存在gourp by时 order by 无效. 一般解决办法就是 ,select * from ( sele ... 
- PAT A1060 (Advanced Level) Practice
			If a machine can save only 3 significant digits, the float numbers 12300 and 12358.9 are considered ... 
- Redis- redis.conf
			############################################## 基本设置 ######################################## # redis ... 
