Java通过wait()和notifyAll()方法实现线程间的通信
Java代码(使用了2个内部类):
package Threads; import java.util.LinkedList; /**
* Created by Frank
*/
public class ProdCons {
protected LinkedList<Object> list = new LinkedList<>();
protected int max;
protected boolean done = false; public static void main(String[] args) throws InterruptedException {
ProdCons prodCons = new ProdCons(100, 3, 4);
Thread.sleep(5 * 1000);
synchronized (prodCons.list) {
prodCons.done = true;
try {
prodCons.notifyAll();
} catch (Exception ex) {
}
}
} private ProdCons(int maxThreads, int nP, int nC) {
this.max = maxThreads;
for (int i = 0; i < nP; i++) {
new Producer().start();
}
for (int i = 0; i < nC; i++) {
new Consumer().start();
}
} class Producer extends Thread {
public void run() {
while (true) {
Object justProduced = null;
try {
justProduced = getObj();
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (list) {
while (list.size() == max) {
try {
list.wait();
} catch (InterruptedException e) {
System.out.println("Producer INTERRUPTED");
}
}
list.addFirst(justProduced);
list.notifyAll();
System.out.println("Produced 1;List size now " + list.size());
if (done) {
break;
}
}
}
}
} class Consumer extends Thread {
public void run() {
while (true) {
Object object = null;
synchronized (list) {
if (list.size() == 0) {
try {
list.wait();
} catch (InterruptedException e) {
System.out.println("Consumer INTERRUPTED");
}
}
if (list.size() > 0) {
object = list.removeLast();
}
list.notifyAll();
System.out.println("List size now " + list.size());
if (done) {
break;
}
}
if (null != object) {
System.out.println("Consuming object " + object);
}
}
}
} private Object getObj() throws InterruptedException {
Thread.sleep(1000);
return new Object();
}
}
Java通过wait()和notifyAll()方法实现线程间的通信的更多相关文章
- Object类中wait带参方法和notifyAll方法和线程间通信
notifyAll方法: 进入到Timed_Waiting(计时等待)状态有两种方式: 1.sleep(long m)方法,在毫秒值结束之后,线程睡醒,进入到Runnable或BLocked状态 2. ...
- Java核心知识点学习----多线程并发之线程间的通信,notify,wait
1.需求: 子线程循环10次,主线程循环100次,这样间隔循环50次. 2.实现: package com.amos.concurrent; /** * @ClassName: ThreadSynch ...
- Object类中wait代餐方法和notifyAll方法和线程间通信
Object类中wait代餐方法和notifyAll方法 package com.yang.Test.ThreadStudy; import lombok.SneakyThrows; /** * 进入 ...
- Java并发读书笔记:如何实现线程间正确通信
目录 一.synchronized 与 volatile 二.等待/通知机制 等待 通知 面试常问的几个问题 sleep方法和wait方法的区别 关于放弃对象监视器 三.等待通知典型 生产者消费者模型 ...
- 并发编程系列小结(线程安全,synchronized,脏读,线程间的通信wait/notify,线程的三种实现方式Demo,可替代wait/notify的方法)
线程安全: 当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法就是线程安全的) synchronized: 可以在任意对象或方法上加锁,而加锁的这段代码称为 ...
- java多线程详解(6)-线程间的通信wait及notify方法
Java多线程间的通信 本文提纲 一. 线程的几种状态 二. 线程间的相互作用 三.实例代码分析 一. 线程的几种状态 线程有四种状态,任何一个线程肯定处于这四种状态中的一种:(1). 产生(New) ...
- Java 多线程(七) 线程间的通信——wait及notify方法
线程间的相互作用 线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务. Object类中相关的方法有两个notify方法和三个wait方法: http://docs.oracle.com/ ...
- 【转】Java学习---线程间的通信
[原文]https://www.toutiao.com/i6572378564534993415/ 两个线程间的通信 这是我们之前的线程. 执行效果:谁抢到资源,谁运行~ 实现线程交替执行: 这里主要 ...
- Java-JUC(九):使用Lock替换synchronized,使用Condition的await,singal,singalall替换object的wait,notify,notifyall实现线程间的通信
Condition: condition接口描述了可能会与锁有关的条件变量.这些用法上与使用object.wait访问隐式监视器类似,但提供了更强大的功能.需要特别指出的是,单个lock可能与多个Co ...
随机推荐
- parity 钱包
数据快照路径 C:\Users\admin\AppData\Local\Parity\Ethereum\chains\ethereum\db\906a34e69aec8c0d\snapshot\res ...
- 开源项目DataTimePicker实现时间和日期的选择
这个开源项目是模仿Google官方的time选择器做的,是否漂亮.让我爱不释手,真心喜欢.很有幸和大家一起分享下,那么话不多说开始讲解. 开源项目地址:https://github.com/fl ...
- Java生成8位随机邀请码,不重复
public static String[] chars = new String[] { "a", "b", "c", "d&q ...
- C#取硬盘、CPU、主板、网卡的序号 ManagementObjectSearcher (WMI)
实现方法参考 http://www.cnblogs.com/chengulv/archive/2012/12/29/2839303.html 下面介绍查看属性的方法: (1)在运行里输入 “WBEMT ...
- input type=file 选择图片并且实现预览效果的实例
为大家带来一篇input type=file 选择图片并且实现预览效果的实例. 通过<input />标签,给它指定type类型为file,可提供文件上传: accept:可选择上传类型, ...
- 从头认识Spring-2.1 自己主动装配(2)-byType(2)
为了解决配置文件中面出现多个同类型的Bean而byType无法匹配的问题.引入了primary和autowire-candidate属性. 1.primary 因为全部bean默认的primary都是 ...
- C语言中将0到1000的浮点数用强制指针类型转换的方式生成一幅图像
搞过计算机图像的人都知道,图像中的每一个像素通常为一个整型数,它可以分成4个无符号的char类型,以表示其RGBA四个分量.一幅图像可以看做是一个二维整型数组.这里我会生成一个float数组,其数组大 ...
- RxJava【变换】操作符 map flatMap concatMap buffer MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 简单使用Google Analytics监控网站浏览行为
之前对网页做用户转化率调查这块,找到了谷歌GA事件,现在有时间对使用方法和遇到问题做个简单记录.官方文档其实也介绍的比较清楚,可以查看官方文档. 首先,在官网申请UA-id,然后在主页加入如下代码: ...
- RabbitMQ的应用场景以及基本原理介绍 【转】
http://blog.csdn.net/whoamiyang/article/details/54954780 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 背景 应用 ...