并发编程基础之wait以及notify的用法
一:概念
线程通信中经常用到wait和notify,顾名思义,wait即让当前线程处于等待状态,notify通知锁对象
上的另一个线程被唤醒,这里的唤醒是指可以去争夺锁资源,nofityAll是唤醒该对象上面所有处于
wait状态的线程
二:示例
线程t2一运行就处于wait等待状态,然后线程t1运行notify,唤醒线程t2
/**
*
*/
package com.day2; /**
* @author Administrator
*
*/
public class NotifyWaitThreadDemo { private int count; public static void main(String[] args) { NotifyWaitThreadDemo demo = new NotifyWaitThreadDemo(); Thread t1 = new Thread("t1") {
public void run() {
synchronized (demo) {
for (int i = 0; i < 100; i++) {
demo.count = i;
if (demo.count == 50) {
System.out.println(Thread.currentThread().getName()+"发出通知");
demo.notify();
}
}
} }
}; Thread t2 = new Thread("t2") {
public void run() {
while (true) {
synchronized (demo) {
System.out.println(Thread.currentThread().getName() + "开始等待");
try {
demo.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + "跳出等待");
System.out.println("demo.count" + demo.count);
break;
} }
}; t2.start();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
t1.start(); }
}
如果还有一个线程t3也处于wait状态,那么t1线程如果想唤醒t1和t3,就需要使用notifyAll
/**
*
*/
package com.day2; /**
* @author Administrator
*
*/
public class NotifyWaitThreadDemo { private int count; public static void main(String[] args) { NotifyWaitThreadDemo demo = new NotifyWaitThreadDemo(); Thread t1 = new Thread("t1") {
public void run() {
synchronized (demo) {
for (int i = 0; i < 100; i++) {
demo.count = i;
if (demo.count == 50) {
System.out.println(Thread.currentThread().getName()+"发出通知");
//demo.notify();
demo.notifyAll();
}
}
} }
}; Thread t2 = new Thread("t2") {
public void run() {
while (true) {
synchronized (demo) {
System.out.println(Thread.currentThread().getName() + "开始等待");
try {
demo.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + "跳出等待");
System.out.println("demo.count" + demo.count);
break;
} }
}; Thread t3 = new Thread("t3") {
public void run() {
while (true) {
synchronized (demo) {
System.out.println(Thread.currentThread().getName() + "开始等待");
try {
demo.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + "跳出等待");
break;
} }
};
t2.start();
t3.start();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
t1.start(); }
}
运行结果:
t2开始等待
t3开始等待
t1发出通知
t3跳出等待
t2跳出等待
demo.count99
并发编程基础之wait以及notify的用法的更多相关文章
- Java并发编程系列-(1) 并发编程基础
1.并发编程基础 1.1 基本概念 CPU核心与线程数关系 Java中通过多线程的手段来实现并发,对于单处理器机器上来讲,宏观上的多线程并行执行是通过CPU的调度来实现的,微观上CPU在某个时刻只会运 ...
- python中并发编程基础1
并发编程基础概念 1.进程. 什么是进程? 正在运行的程序就是进程.程序只是代码. 什么是多道? 多道技术: 1.空间上的复用(内存).将内存分为几个部分,每个部分放入一个程序,这样同一时间在内存中就 ...
- Java并发编程基础
Java并发编程基础 1. 并发 1.1. 什么是并发? 并发是一种能并行运行多个程序或并行运行一个程序中多个部分的能力.如果程序中一个耗时的任务能以异步或并行的方式运行,那么整个程序的吞吐量和可交互 ...
- TCP与UDP比较 以及并发编程基础知识
一.tcp比udp真正可靠地原因 1.为什么tcp比udp传输可靠地原因: 我们知道在传输数据的时候,数据是先存在操作系统的缓存中,然后发送给客户端,在客户端也是要经过客户端的操作系统的,因为这个过程 ...
- 并发-Java并发编程基础
Java并发编程基础 并发 在计算机科学中,并发是指将一个程序,算法划分为若干个逻辑组成部分,这些部分可以以任何顺序进行执行,但与最终顺序执行的结果一致.并发可以在多核操作系统上显著的提高程序运行速度 ...
- Java并发编程基础三板斧之Semaphore
引言 最近可以进行个税申报了,还没有申报的同学可以赶紧去试试哦.不过我反正是从上午到下午一直都没有成功的进行申报,一进行申报 就返回"当前访问人数过多,请稍后再试".为什么有些人就 ...
- Java高并发编程基础三大利器之CountDownLatch
引言 上一篇文章我们介绍了AQS的信号量Semaphore<Java高并发编程基础三大利器之Semaphore>,接下来应该轮到CountDownLatch了. 什么是CountDownL ...
- Java并发编程--基础进阶高级(完结)
Java并发编程--基础进阶高级完整笔记. 这都不知道是第几次刷狂神的JUC并发编程了,从第一次的迷茫到现在比较清晰,算是个大进步了,之前JUC笔记不见了,重新做一套笔记. 参考链接:https:// ...
- day20-多并发编程基础(一)
重新写一下吧,系统奔溃了,以前写的完全没了,悲催,今日主要写进程 1. 进程的理论知识 2. python中的进程操作 开始今日份整理,加油,你是最胖的!!! 1. 进程的理论知识 1.1 操作系统的 ...
随机推荐
- Django——photo
要点: models 图片类型文件要使用models.ImageField(upload='文件夹名') 普通文件使用FileField 时间类型使用DatetimeField(auto_now_ad ...
- Disruptor 详解
想了解一个项目,最好的办法就是,把它的源码搞到本地自己捣鼓. 在网上看了 N 多人对 Disruptor 速度的吹捧,M 多人对它的机制分析,就连 Disruptor 官方文档中,也 NB 哄哄自诩: ...
- JSOUP 请求JSON
JSOUP请求JSON Document doc = Jsoup .connect(Constant.DATA_URL) .header("Accept", "*/*&q ...
- leetcode 566. 重塑矩阵 c++ 实现
1.问题描述: 在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据. 给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表示想 ...
- 【不做标题党,只做纯干货】HashMap在jdk1.7和1.8中的实现
同步首发:http://www.yuanrengu.com/index.php/20181106.html Java集合类的源码是深入学习Java非常好的素材,源码里很多优雅的写法和思路,会让人叹为 ...
- TensorFlow+Keras 01 人工智能、机器学习、深度学习简介
1 人工智能.机器学习.深度学习的关系 “人工智能” 一词最早是再20世纪50年代提出来的. “ 机器学习 ” 是通过算法,使用大量数据进行训练,训练完成后会产生模型 有监督的学习 supervise ...
- 20.翻译系列:Code-First中的数据库迁移技术【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/migration-in-code-first.aspx EF 6 Code-First ...
- [elk]elasticsearch实现冷热数据分离
本文以最新的elasticsearch-6.3.0.tar.gz为例,为了节约资源,本文将副本调为0, 无client角色 https://www.elastic.co/blog/hot-warm-a ...
- go 资料
channel 底层原理 https://www.youtube.com/watch?v=KBZlN0izeiY go concurrency https://www.youtube.com/watc ...
- Deep Reinforcement Learning
Reinforcement-Learning-Introduction-Adaptive-Computation http://incompleteideas.net/book/bookdraft20 ...