并发编程基础之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 操作系统的 ...
随机推荐
- vim小技巧2
yyp:复制当前行到下一行 cw:改变当前字符串 xp:交换当前字符和右边字符
- git常用命令2--- git rebase
git rebase:简单而言就是把某个分支上的提交commit嫁接到另一个commit的后面,在这个过程中这些commit的base相对就改变了,也就叫变基. git rebase <upst ...
- Cow Exhibition [POJ2184] [DP] [背包的负数处理]
题意: 有很多羊,每只羊有一个幽默度和智商,要选出一些羊,智商加幽默度总和最大,其中智商总和和幽默度总和都不能是负数. 样例输入: 5 -5 7 8 -6 6 -3 2 1 -8 -5 样例输出: 8 ...
- Java 动态代理 Demo
相比于静态代理,动态代理避免了开发者编写各个繁锁的静态代理类,只需指定一组接口及目标类对象就能动态地获取代理对象. 使用动态代理的六大步骤: 1 通过实现InvocationHandler接口来自定义 ...
- consul 文档
consul 服务发现 服务发现,用docker的时候可以使用,并且可以实现负载均衡. 因业务需要,所以留一下自己搜到比较好的资料吧 英文:https://www.consul.io/intro/ge ...
- elment ui 图片上传遇到的一些问题
图片上传返回200,message显示请上传图片 注意上图中的name字段要和服务器接受的name相同,这里我们是imgfile,默认name不是这个,所以要在el-upload组件上设置name属性 ...
- 更好用的excel国际化多语言导出
不知道大家在开发中有没有遇到过『excel导出』的需求,反正我最近写了不少这种功能,刚开始利用poi,一行行的手动塞数据,生成excel,而且还有国际化需求,比如:标题栏有一列,用户切换成" ...
- 搭建memcached使用:/usr/bin/phpize 安装memcached扩展的时候报错
Can't find PHP headers in /usr/include/phpThe php-devel package is required for use of this command ...
- 关于jmeter命令行执行.jmx文件出现Error in NonGUIDriver java.lang.RuntimeException: Could not find the TestPlan c
- 什么?又是404!趣图助你理解HTTP状态码~
HTTP状态码(一): 注释: 301—永久移动.被请求的资源已被永久移动位置: 302—请求的资源现在临时从不同的 URI 响应请求: 305—使用代理.被请求的资源必须通过指定的代理才能被访问 ...