java队列 notify_java使用线程做一个消息队列,wait,notify
java使用线程做一个消息队列,wait,notify作者:曾 彬
使用synchronized字段让部分代码或者方法串行执行
使用wait方法,让当前线程进行等待
使用notify方法通知其它线程,锁将要被释放(要等synchronized代码都执行完才释放)
notify和notifyAll的区别:
前者:随机通知一个线程从等待池,进入锁池
后者:通知所有线程,从等待池,进入锁池,进行争抢锁,如果线程没抢到锁,他还会留在锁池中,除非再调用wait方法
理论上,优先级高的线程会先获得锁
package com.zengbingo.chapter5;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.util.concurrent.TimeUnit;
/**
* wait
* notify
*
*
*/
@SpringBootApplication
public class Part8 {
public static void main(String[] args) throws Exception{
threadSleep();
}
/**
* 线程sleep
* @throws Exception
*/
private static void threadSleep() throws Exception{
final EventQueue eventQueue = new EventQueue();
/**
* 压入
* wait 让使用当前对象的线程进入阻塞状态
*/
new Thread(() -> {
for (;;){
eventQueue.offer(new EventQueue.Event());
try {
TimeUnit.MILLISECONDS.sleep(500);
}catch (Exception e){
}
}
}, "发放者").start();
/**
* 取出
* notify 让使用当前对象的线程推出阻塞状态,如果非阻塞则忽略
*/
new Thread(() -> {
for (;;){
eventQueue.take();
try {
TimeUnit.SECONDS.sleep(5);
}catch (Exception e){
}
}
}, "消费者").start();
}
}
其中EventQueue
package com.zengbingo.chapter5;
import java.util.LinkedList;
/**
* 使用synchronized字段让部分代码或者方法串行执行
*/
public class EventQueue {
private final int max;
static class Event{}
private final LinkedList eventQueue = new LinkedList<>();
private final static int DEFAULT_MAX_EVENT = 10;
public EventQueue(){
this(DEFAULT_MAX_EVENT);
}
public EventQueue(int max){
this.max = max;
}
public void offer(Event event){
synchronized (eventQueue){
if (eventQueue.size() >= max) {
try {
System.out.println("eventQueue队列已满");
eventQueue.wait();
}catch (Exception e){
}
}
System.out.println("eventQueue加入新任务");
eventQueue.addLast(event);
eventQueue.notify();
}
}
public Event take(){
synchronized (eventQueue){
if (eventQueue.isEmpty()) {
try{
System.out.println("eventQueue队列是空的");
eventQueue.wait();
}catch (Exception e){
}
}
System.out.println("eventQueue处理新任务");
Event event = eventQueue.removeFirst();
eventQueue.notify();
return event;
}
}
}
java队列 notify_java使用线程做一个消息队列,wait,notify相关推荐
- 消息队列(1):一个消息队列应该有的特点
消息队列常见场景 异步解耦 削峰填谷 日志收集分析 代替事务,最终一致 消息队列特点 消息队列之所以能异步,就是因为消息并不是实时处理的,那肯定会有一个存储消息,处理消息的地方,才能达到异步效果. 所 ...
- JAVA面试题:你怎么设计一个消息队列?
1 面试题 写一个消息队列,你如何进行架构设计,说一下你的思路! 2 考点分析 一般面试官要考察两块: (1)你有没有对某一个消息队列做过较为深入的原理的了解,或者从整体了解把握住一个mq的架构原理 ...
- 什么鬼,面试官竟然让我用Redis实现一个消息队列!!?
GitHub 9.4k Star 的Java工程师成神之路 ,不来了解一下吗? GitHub 9.4k Star 的Java工程师成神之路 ,真的不来了解一下吗? GitHub 9.4k Star 的 ...
- 面试官竟让我用Redis实现一个消息队列!
来自公众号:Hollis >>>千人线上直播活动报名倒计时(今晚20:00): 从Oracle出发,走进GaussDB的世界 众所周知,redis是一个高性能的分布式key-valu ...
- 消息中间件系列(七):如何从0到1设计一个消息队列中间件
消息队列作为系统解耦,流量控制的利器,成为分布式系统核心组件之一. 如果你对消息队列背后的实现原理关注不多,其实了解消息队列背后的实现非常重要. 不仅知其然还要知其所以然,这才是一个优秀的工程师需要具 ...
- UI线程和Windows消息队列
在Windows应用程序中,窗体是由一种称为"UI线程(User Interface Thread)"的特殊类型的线程创建的. 首先,UI线程是一种"线程",所 ...
- 自已动手做高性能消息队列
前言 本人觉得码农的技术提升应该是从how to do到why do,而项目或产品都是从why do到how to do,按题来,所以呢下面先从大的方面介绍一下消息队列. 消息队列是分布式高并发面目中 ...
- RTX线程通信之——消息队列
文章目录 Message Queue 消息队列 RTX 消息队列 API 使用案例 小结 参考资料 Message Queue 我们知道,Thread and Event Flags.Semaphor ...
- java字符存储_用java的类集框架做一个字符存储器(15)
11.这是java的关于java的类集框架做一个字符存储器的源代码可以直接进行编译运行,希望大家能够从中获益良多. package niming; //导入ArrayList这个类 import ja ...
- 高薪程序员面试题精讲系列127之如何设计一个消息队列?如何保证消息的执行顺序?
一. 面试题及剖析 1. 今日面试题 如何保证消息队列中消息的执行顺序? RabbitMQ消息过期了怎么办? 如何设计一个消息队列? 如果让你自己设计一个消息队列,该怎么实现? 2. 题目剖析 壹哥在 ...
最新文章
- Centos Git1.7.1升级到Git2.2.1
- Linux系统卸载Apache(阿帕奇)环境教程
- 虚拟化系列-VMware vSphere 5.1 高可用性
- Delphi自定义过程获取本机ip,名字,用户名
- IE6.0、IE7.0 、FireFox 在样式中的不同写法.doc
- tinydate.js[v0.3] 新增了字符串格式化为日期对象的函数
- Centos7 下载、安装、配置、启动部署
- Python获取矢量文件属性表字段及类型
- gRPC 1.20.1 发布,谷歌开源的高性能 RPC 框架
- 电力101/104规约文件服务报文浅析
- 微pe工具箱是微软的吗_【 微PE工具箱 】微PE工具箱(系统工具)新版下载 - U大师...
- 阿里云 Aliplayer高级功能介绍(九):自动播放体验...
- 表格筛选后复制粘贴方法
- [UWP开发] Win10微博分享
- 使用深度图重建世界坐标
- 2021年焊工(初级)考试资料及焊工(初级)新版试题
- TCP粘包问题以及解决方法
- MAC压缩的文件在win下减压出来是空文件夹
- 感谢开源,让我的青春永不褪色!
- php获取上传图片的宽和高
热门文章
- .NET使用存储过程实现对数据库的增删改查
- 《结对-航空购票系统-开发环境搭建过程》
- c++ primer plus(第6版)中文版 第十二章编程练习答案
- typeof和instanceof的用法
- 第三方魔兽金币交易平台的影响力会很快地褪去
- 欧几里德算法(求最大公约数和最小公倍数)
- 遗传算法导论(转载)
- 基于蚁群算法求解求解TSP问题(JAVA)
- 拓端tecdat|Python风险价值计算投资组合VaR(Value at Risk )、期望损失ES(Expected Shortfall)
- 拓端tecdat|R语言动量交易策略分析调整后的数据