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实现线程间通知的更多相关文章

  1. Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。

    Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离.

  2. wait、notify、notifyAll实现线程间通信

    在Java中,可以通过配合调用Object对象的wait()方法和notify()方法或notifyAll()方法来实现线程间的通信.在线程中调用wait()方法,将阻塞等待其他线程的通知(其他线程调 ...

  3. 并发编程系列小结(线程安全,synchronized,脏读,线程间的通信wait/notify,线程的三种实现方式Demo,可替代wait/notify的方法)

    线程安全: 当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法就是线程安全的) synchronized: 可以在任意对象或方法上加锁,而加锁的这段代码称为 ...

  4. java中关于线程间协作所用关键字synchronized,wait,notify的用法

    wait/notify()关键字适用于一个线程通知另一个线程所需的条件状态已就绪,最常用于线程在循环中休眠直到获取特定条件的场景. 例如,一个线程一直等待直到队列中有一个组件能够处理:当组件添加到队列 ...

  5. java并发编程(十一)线程间的通信notify通知的遗漏

    notify通知的遗漏很容易理解,即threadA还没开始wait的时候,threadB已经notify了,这样,threadB通知是没有任何响应的,当threadB退出synchronized代码块 ...

  6. 转:【Java并发编程】之十一:线程间通信中notify通知的遗漏(含代码)

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17228213 notify通知的遗漏很容易理解,即threadA还没开始wait的时候,t ...

  7. Java-JUC(九):使用Lock替换synchronized,使用Condition的await,singal,singalall替换object的wait,notify,notifyall实现线程间的通信

    Condition: condition接口描述了可能会与锁有关的条件变量.这些用法上与使用object.wait访问隐式监视器类似,但提供了更强大的功能.需要特别指出的是,单个lock可能与多个Co ...

  8. 【Java并发编程】之十一:线程间通信中notify通知的遗漏

    notify通知的遗漏很容易理解,即threadA还没开始wait的时候,threadB已经notify了,这样,threadB通知是没有任何响应的,当threadB退出synchronized代码块 ...

  9. Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition

    Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...

随机推荐

  1. js判断登陆用户名及密码是否为空的简单实例

    js判断登陆用户名及密码是否为空的简单实例 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <script type="text/javascript ...

  2. HDOJ 1393 Weird Clock(明确题意就简单了)

    Problem Description A weird clock marked from 0 to 59 has only a minute hand. It won't move until a ...

  3. 法线从object space到eye space的转换((normal matrix)

    对于顶点来说,从object Space转换到eye space, 使用model-view矩阵就好了.那么顶点的法线是否也可以直接使用model-view矩阵转化? 通常情况下是不行的. 如下两张图 ...

  4. Hadoop、Spark 集群环境搭建

    1.基础环境搭建 1.1运行环境说明 1.1.1硬软件环境 主机操作系统:Windows 64位,四核8线程,主频3.2G,8G内存 虚拟软件:VMware Workstation Pro 虚拟机操作 ...

  5. [原]pomelo基础知识(一)

    1.pomelo基本介绍 http://blog.gfdsa.net/2013/06/04/pomelo/pomelo_study_two/ 2.如何配置一个gate服务器 (1)首先 需要在game ...

  6. Spring 整合 Junit4 进行单元测试

    1. pom.xml 引入JAR依赖: <dependency> <groupId>junit</groupId> <artifactId>junit& ...

  7. The last packet successfully received from the server was 20,519 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago.

    本地升级了下MySQL的版本,从5.6升为5.7,数据文件直接拷贝的,项目查询数据库报错: Could not retrieve transation read-only status server ...

  8. MVC的ViewData自动给Razor写的input赋值

    问题: 写编辑的时候,突然发现,没有值的model,突然出现了值,而且值是ViewData中值. 后台: this.ViewData["test"] = "测试" ...

  9. 使用原生Java代码生成可执行Jar包

    最近想做一个功能,就是把我们编译后的字节码及其资源文件打包成一个可执行的jar包,在装有jre的机器上双击就能运行. 首先是我们需要选择哪些字节码和文件需要打包到文件中,这个我们用JFileChoos ...

  10. springboot之thymeleaf学习

    这是springboot的view层不建议使用jsp,而是thymeleaf,虽然我也不知道为什么,但是后来可能会明白一些.学springBoot也遇到很多bug,导致脱累了进度.有点类似于jsp,但 ...