notify,wait,synchronized实现线程间通知
wait阻塞线程释放锁;notify使wait所在的线程被唤醒在次获得锁,并执行,但要等到notify所在的线程代码全部执行后!
示例代码如下:
package com.vhbi.service.impl; import com.sun.org.apache.xerces.internal.xs.datatypes.ObjectList; import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger; /**
* Created by zzq on 2017/5/8.
*/
public class TeamTest { private LinkedList _list = new LinkedList<Object>(); private int size = 0; private AtomicInteger atomicInteger = new AtomicInteger(); public TeamTest(int size) {
this.size = size;
} private final Object lock = new Object(); public void take() throws Exception {
synchronized (lock) {
while (0 == atomicInteger.get()) {//计数器和最大值相等
lock.wait();//进入等待状态,释放锁
}
//被唤醒后
//1.计数器减一
atomicInteger.decrementAndGet();
//2.队列去掉一个
Object currObj = _list.removeFirst();
System.out.println("------take------ " + currObj);
//3.获得锁,唤醒wait执行线程的等待
lock.notify();
}
} public void put(Object obj) throws Exception {
synchronized (lock) {
while (this.size == atomicInteger.get()) {//计数器和最大值相等
lock.wait();//进入等待状态,释放锁
}
//被唤醒后
//1.计数器加一
atomicInteger.incrementAndGet();
//2.队列添加一个
_list.add(obj);
System.out.println("------put------ " + obj);
//3.获得锁,唤醒wait执行线程的等待
lock.notify();
}
}
}
测试结果代码:
@org.junit.Test
public void main2() throws Exception {
final TeamTest teamTest = new TeamTest(5);
teamTest.put(1);
teamTest.put(2);
teamTest.put(3);
teamTest.put(4);
teamTest.put(5); Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
try {
teamTest.put(6);
} catch (Exception e) {
e.printStackTrace();
}
}
});
t1.start(); Thread.sleep(5000);
teamTest.take(); } @org.junit.Test
public void main3() throws Exception {
final TeamTest teamTest = new TeamTest(5); Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
try {
teamTest.take();
} catch (Exception e) {
e.printStackTrace();
}
}
});
t1.start(); Thread.sleep(5000);
teamTest.put(1);
teamTest.put(2); }
notify,wait,synchronized实现线程间通知的更多相关文章
- Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。
Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离.
- wait、notify、notifyAll实现线程间通信
在Java中,可以通过配合调用Object对象的wait()方法和notify()方法或notifyAll()方法来实现线程间的通信.在线程中调用wait()方法,将阻塞等待其他线程的通知(其他线程调 ...
- 并发编程系列小结(线程安全,synchronized,脏读,线程间的通信wait/notify,线程的三种实现方式Demo,可替代wait/notify的方法)
线程安全: 当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法就是线程安全的) synchronized: 可以在任意对象或方法上加锁,而加锁的这段代码称为 ...
- java中关于线程间协作所用关键字synchronized,wait,notify的用法
wait/notify()关键字适用于一个线程通知另一个线程所需的条件状态已就绪,最常用于线程在循环中休眠直到获取特定条件的场景. 例如,一个线程一直等待直到队列中有一个组件能够处理:当组件添加到队列 ...
- java并发编程(十一)线程间的通信notify通知的遗漏
notify通知的遗漏很容易理解,即threadA还没开始wait的时候,threadB已经notify了,这样,threadB通知是没有任何响应的,当threadB退出synchronized代码块 ...
- 转:【Java并发编程】之十一:线程间通信中notify通知的遗漏(含代码)
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17228213 notify通知的遗漏很容易理解,即threadA还没开始wait的时候,t ...
- Java-JUC(九):使用Lock替换synchronized,使用Condition的await,singal,singalall替换object的wait,notify,notifyall实现线程间的通信
Condition: condition接口描述了可能会与锁有关的条件变量.这些用法上与使用object.wait访问隐式监视器类似,但提供了更强大的功能.需要特别指出的是,单个lock可能与多个Co ...
- 【Java并发编程】之十一:线程间通信中notify通知的遗漏
notify通知的遗漏很容易理解,即threadA还没开始wait的时候,threadB已经notify了,这样,threadB通知是没有任何响应的,当threadB退出synchronized代码块 ...
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...
随机推荐
- Android遍历API (1) 动画篇——克隆动画AnimationCloning
从我学Android开始,一直就想做一件事.就是好好把APIDemo看一遍.今天开始会抽时间把Android官方的APIDemo程序全部过一遍.主要是为了两个目的:第一,复习以前学习的API用法.第二 ...
- python 截取 取出一部分的字符串
下面是split截取获得 >>> str = 'http://manualfile.s3.amazonaws.com/pdf/gti-chis-1-user-9fb-0-7a05a5 ...
- 理解syslinux,SYSLINUX和PXELINUX
在研究网络装机的过程中,菜菜地被Syslinux.SYSLINUX和PXELINUX这些定义折磨了一下 它们有什么区别和联系?为什么配置PXELINUX要安装的是Syslinux而不是Pxelinux ...
- Spring学习笔记--Spring IOC
沿着我们上一篇的学习笔记,我们继续通过代码学习IOC这一设计思想. 6.Hello类 第一步:首先创建一个类Hello package cn.sxt.bean; public class Hello ...
- zope.interface 库学习一
由于python没有接口概念,所以zope 提供了个第三方库开源使用,下面简单介绍zope.interface.implementer的使用 直接看例子,下面例子是在twisted里摘录的 接口IRe ...
- shell参数扩展
http://zuyunfei.com/2016/03/23/Shell-Truncate-File-Extension/
- Ubuntu上pip安装uwsgi失败的原因之一(未联网)
ubuntu@ubuntu:~$ sudo pip install uwsgi 报错:The directory '/home/ubuntu/.cache/pip/http' or its paren ...
- 异常could not retrieve snapshot
前两天项目升级,项目部署到生产上之后,报错: could not retrieve snapshot 上网查的结果是: “.hbm.xml中的字段没有与数据库中一样,就是说有些字段在文件中有,但是在数 ...
- AutoFac Ioc依赖注入容器
本文原著:牛毅 原文路径 http://niuyi.github.io/blog/2012/04/06/autofac-by-unit-test/ 理解IOC容器请看下图: 没有使用IOC容器的情况 ...
- LeetCode 29 - 两数相除 - [位运算]
题目链接:https://leetcode-cn.com/problems/divide-two-integers/description/ 给定两个整数,被除数 dividend 和除数 divis ...