线程间的通信----wait/notify机制
wait/notify机制
实现多个线程之间的通信可以使用wait、notify、notifyAll三个方法。这三个方法都是Object类的方法。
wait():导致当前线程等待,直到另一个线程调用此对象的 notify()方法或 notifyAll()方法。
wait(long timeout):导致当前线程等待,直到另一个线程调用此对象的 notify()方法或 notifyAll()方法,或者已经过了指定的时间量。
notify():唤醒正在此对象监视器上等待的单个线程。
notifyAll():唤醒等待此对象监视器的所有线程。
在调用以上方法时必须获得对象的对象锁,要在同步方法,或者同步块中调用。否则会抛出IllegalMonitorStateException。
wait执行后锁被自动释放,notify执行后并不会立即释放此对象的锁,需要等到notify的synchronized方法执行完全后,wait的线程才能获得对象锁。
验证代码
等待线程:
/**
* @author monkjavaer
* @date 2018/12/13 22:00
*/
public class ThreadWait extends Thread {
private Object work; public ThreadWait(Object work) {
this.work = work;
} @Override
public void run() {
try {
synchronized (work){
System.out.println("...before wait...");
work.wait();
System.out.println("...after wait...");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
唤醒线程:
/**
* @author monkjavaer
* @date 2018/12/13 22:04
*/
public class ThreadNotify extends Thread {
private Object work; public ThreadNotify(Object work) {
this.work = work;
} @Override
public void run() {
synchronized (work){
System.out.println("...before notify...");
work.notify();
System.out.println("...after notify...");
//此处可测试,notify执行后并没有释放此对象的锁,需要等到notify的synchronized方法执行完全后,wait的线程才能获得对象锁。
try {
TimeUnit.MILLISECONDS.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("...after notify synchronized...");
}
}
测试:
public class WaitNotifyTest {
public static void main(String[] args) {
Object work = new Object();
ThreadWait wait = new ThreadWait(work);
wait.start();
ThreadNotify notify = new ThreadNotify(work);
notify.start();
}
}
输出:
...before wait...
...before notify...
...after notify...
...after notify synchronized...
...after wait...
线程间的通信----wait/notify机制的更多相关文章
- 并发编程系列小结(线程安全,synchronized,脏读,线程间的通信wait/notify,线程的三种实现方式Demo,可替代wait/notify的方法)
线程安全: 当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法就是线程安全的) synchronized: 可以在任意对象或方法上加锁,而加锁的这段代码称为 ...
- 使用wait/notify实现线程间的通信
之前对Java多线程中的wait/notify机制理解都不是很清晰,最近看了一本技术书,通过里面的讲解再配上一些博客,终于算是对wait/notify有了进一步的理解. 下面就来说说我对这两个方法的认 ...
- Java核心知识点学习----多线程并发之线程间的通信,notify,wait
1.需求: 子线程循环10次,主线程循环100次,这样间隔循环50次. 2.实现: package com.amos.concurrent; /** * @ClassName: ThreadSynch ...
- java多线程详解(6)-线程间的通信wait及notify方法
Java多线程间的通信 本文提纲 一. 线程的几种状态 二. 线程间的相互作用 三.实例代码分析 一. 线程的几种状态 线程有四种状态,任何一个线程肯定处于这四种状态中的一种:(1). 产生(New) ...
- Java 多线程(七) 线程间的通信——wait及notify方法
线程间的相互作用 线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务. Object类中相关的方法有两个notify方法和三个wait方法: http://docs.oracle.com/ ...
- Java-JUC(九):使用Lock替换synchronized,使用Condition的await,singal,singalall替换object的wait,notify,notifyall实现线程间的通信
Condition: condition接口描述了可能会与锁有关的条件变量.这些用法上与使用object.wait访问隐式监视器类似,但提供了更强大的功能.需要特别指出的是,单个lock可能与多个Co ...
- Java多线程之线程的状态以及线程间协作通信导致的线程状态转换
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6561589.html 一:线程的状态以及变化图 Java中线程中状态可分为五种:New(新建状态),Ru ...
- Java基础教程:多线程基础(2)——线程间的通信
Java基础教程:多线程基础(2)——线程间的通信 使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时还会使程序员对各线程任务在处理的过程中进行有效的把控与监督. 线程间的通信 ...
- Handler不同线程间的通信
转http://www.iteye.com/problems/69457 Activity启动后点击一个界面按钮后会开启一个服务(暂定为padService),在padService中会启动一个线程( ...
随机推荐
- 【计蒜客习题】两仪剑法(gcd)
两仪剑法是武当派武功的高级功夫,且必须 2 个人配合使用威力才大.同时该剑法招数变化太快.太多.设武当弟子甲招数变化周期为 n,武当弟子乙招数变化周期为 m,两弟子同时使用该剑法,当 2 人恰好同时达 ...
- 【知识总结】多项式全家桶(三)(任意模数NTT)
经过两个月的咕咕,"多项式全家桶" 系列终于迎来了第三期--(雾) 上一篇:[知识总结]多项式全家桶(二)(ln和exp) 先膜拜(伏地膜)大恐龙的博客:任意模数 NTT (在页面 ...
- [ CodeForces 1059 D ] Nature Reserve
\(\\\) \(Description\) 你现在有\(N\)个分布在二维平面上的整点\((x_i,y_i)\),现在需要你找到一个圆,满足: 能够覆盖所有的给出点 与\(x\)轴相切 现在需要你确 ...
- 第八届蓝桥杯省赛C/C++ A组第8题 包子凑数
参考了http://blog.csdn.net/y1196645376/article/details/69718192 思路: 数论+完全背包. 实现: #include <iostream& ...
- 08使用NanoPiM1Plus在Android4.4.2下接TF卡
08使用NanoPiM1Plus在Android4.4.2下接TF卡 大文实验室/大文哥 壹捌陆捌零陆捌捌陆捌贰 21504965 AT qq.com 完成时间:2017/12/5 17:51 版本: ...
- Fiddler抓取Intellij Idea中执行的web网络请求
首先可以打开命令行 输入:ipconfig 找到本机配置的IP地址 这里是: 192.168.97.122 或者打开Fiddler 点击如下图片中的小三角符号:将鼠标放在online的位置,也可以看到 ...
- Farseer.net轻量级开源框架 中级篇:动态数据库访问
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 自定义配置文件 下一篇:Farseer.net轻量级开源框架 中级篇: 数据库切换 ...
- java读取03、07版EXCEL
03版excel,需要用到jxl.jar这个jar包 package test.poi; import java.io.File; import java.io.IOException; import ...
- Mysql导入导出大量数据的方法、备份恢复办法
经常使用PHP+Mysql的朋友一般都是通过phpmyadmin来管理数据库的.日常的一些调试开发工作,使用phpmyadmin确实很方便.但是当我们需要导出几百兆甚至几个G的数据库时,phpmyad ...
- POJ_1611_The Suspect
The Suspects Time Limit: 1000MS Memory Limit: 20000K Total Submissions: 25149 Accepted: 12329 De ...