java 线程间的通信 (wait / notify / notifyAll)
package waitnotifytest; import java.util.Collections;
import java.util.List;
import com.google.common.collect.Lists; /**
* Test
*/
public class Test { private static final Class<Test> lockObj = Test.class; private final List<String> list = Collections.synchronizedList(Lists.newArrayListWithCapacity(10)); public static void main(String[] args) {
Test test = new Test();
test.test();
} private void push() {
while (list.size() >= 10) {
System.out.println("厨师:" + Thread.currentThread().getName() + " 等待中...");
try {
synchronized (lockObj) {
lockObj.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
list.add("item");
list.add("item");
list.add("item");
list.add("item");
list.add("item");
System.out.println("出菜台的菜品数量" + list.size());
synchronized (lockObj) {
System.out.println("厨师通知所有人");
lockObj.notifyAll();
}
} private void popup() {
synchronized (lockObj) {
while (list.isEmpty()) {
try {
System.out.println("服务员:" + Thread.currentThread().getName() + "等待中...");
lockObj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
list.remove(list.size() - 1);
}
System.out.println("出菜口的菜品数量为:" + list.size());
synchronized (lockObj) {
lockObj.notifyAll();
}
System.out.println("服务员通知所有人...");
} public void test() {
Runnable runnable = new Runnable() {
@Override
public void run() {
while (true) {
push();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}; Runnable runnable2 = new Runnable() {
@Override
public void run() {
while (true) {
popup();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}; for (int i = 0; i < 2; i++) {
Thread thread = new Thread(runnable);
thread.start(); }
for (int i = 0; i < 10; i++) {
Thread thread = new Thread(runnable2);
thread.start();
} }
}
java 线程间的通信 (wait / notify / notifyAll)的更多相关文章
- 并发编程系列小结(线程安全,synchronized,脏读,线程间的通信wait/notify,线程的三种实现方式Demo,可替代wait/notify的方法)
线程安全: 当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法就是线程安全的) synchronized: 可以在任意对象或方法上加锁,而加锁的这段代码称为 ...
- 【java线程系列】java线程系列之线程间的交互wait()/notify()/notifyAll()及生产者与消费者模型
关于线程,博主写过java线程详解基本上把java线程的基础知识都讲解到位了,但是那还远远不够,多线程的存在就是为了让多个线程去协作来完成某一具体任务,比如生产者与消费者模型,因此了解线程间的协作是非 ...
- Java线程间如何通信(五)
1.简述 线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能称为一个整体. 使线程之间进行通信后,在大大提高CPU利用率的同时还会使开发人员对各个线程任务在处理的过程中进行有效的把控. ...
- 线程间的通信----wait/notify机制
wait/notify机制 实现多个线程之间的通信可以使用wait.notify.notifyAll三个方法.这三个方法都是Object类的方法.wait():导致当前线程等待,直到另一个线程调用此对 ...
- java 线程 wait join sleep yield notify notifyall synchronized
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 休息方法 : 在指定时间内 让该线程 暂停, 不会释放 锁标志. 等待方法: 让 该 线 ...
- 说说Java线程间通信
序言 正文 [一] Java线程间如何通信? 线程间通信的目标是使线程间能够互相发送信号,包括如下几种方式: 1.通过共享对象通信 线程间发送信号的一个简单方式是在共享对象的变量里设置信号值:线程A在 ...
- 说说 Java 线程间通信
序言 正文 一.Java线程间如何通信? 线程间通信的目标是使线程间能够互相发送信号,包括如下几种方式: 1.通过共享对象通信 线程间发送信号的一个简单方式是在共享对象的变量里设置信号值:线程A在一个 ...
- Java线程间通信-回调的实现方式
Java线程间通信-回调的实现方式 Java线程间通信是非常复杂的问题的.线程间通信问题本质上是如何将与线程相关的变量或者对象传递给别的线程,从而实现交互. 比如举一个简单例子,有一个多线程的 ...
- java多线程详解(6)-线程间的通信wait及notify方法
Java多线程间的通信 本文提纲 一. 线程的几种状态 二. 线程间的相互作用 三.实例代码分析 一. 线程的几种状态 线程有四种状态,任何一个线程肯定处于这四种状态中的一种:(1). 产生(New) ...
随机推荐
- 用面向对象重写thread 实现多次调用一个线程
思路: 利用thread类中,run方法在子线程中调用,其他方法在主线程调用,所以将生产者写入主线程,将消费者写入run函数中在子线程中执行,完成生产者消费者模型 注意: 1. 要在 init 函数中 ...
- 【JavaScript】对象
No1: typeof操作符获取对象的类型 null的类型是object,Array的类型也是object,如果我们用typeof将无法区分出null.Array和通常意义上的object——{}. ...
- RabbitMQ实战经验分享
前言 最近在忙一个高考项目,看着系统顺利完成了这次高考,终于可以松口气了.看到那些即将参加高考的学生,也想起当年高三的自己. 下面分享下RabbitMQ实战经验,希望对大家有所帮助: 一.生产消息 关 ...
- 765. 有效的三角形.md
描述 给出三个整数 a, b, c, 如果它们可以构成三角形,返回 true. 三角形的定义 (Wikipedia) 样例 给定 a = 2, b = 3, c = 4 返回 true 给定 a = ...
- 【转】Linux服务部署--Java(三) Nginx
原文地址:Nginx Linux详细安装部署教程 一.Nginx简介 Nginx是一个web服务器也可以用来做负载均衡及反向代理使用,目前使用最多的就是负载均衡,具体简介我就不介绍了百度一下有很多,下 ...
- CentOS7.5 搭建ElasticSearch6.4.2 + Kibana6.4.2 环境
本文目录: 1.创建用户 2.授权sudo 3.下载ElasticSearch.Kibana 3.1 创建目录 3.2 下载文件 4.配置Elasticsearch 5.配置Kibana 参考资料: ...
- Sublime Text3 最新版本V3.1.1 build3117注册码,亲测可以完美激活~
Sublime Text 3 最新注册码 官网下载的最新版本V3.1.1 build3117,亲测以下注册码可以正常激活 ----- BEGIN LICENSE ----- sgbteam Singl ...
- renren-vue 基于最新node10.8、npm6.2 在win7 x64系统 成功初始化启动
renren-vue 基于最新node.npm初始化之路 renren-fast 是一个轻量级的 Spring Boot 快速开发平台,能快速开发项目并交付[接私活利器] 完善的 XSS 防范及脚本过 ...
- BZOJ4738 : 汽水
二分答案$mid$,若存在一条路径满足$|ave-k|<mid$,则答案至多为$mid-1$. 若$ave\leq k$,则$\sum(w-k)\leq 0$,且$\sum(k-w-mid)&l ...
- [P1441]砝码称重 (搜索+DP)
对于我这种蒟蒻,是很不错的一题了. dfs搜索当前状态 满足时DP 比较坑的地方就是起始的地方 我一开始从1开始,搜索写的是从0开始. 后来就统一用0开始的了. #include<bits/st ...