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. 消息队列(1):一个消息队列应该有的特点

    消息队列常见场景 异步解耦 削峰填谷 日志收集分析 代替事务,最终一致 消息队列特点 消息队列之所以能异步,就是因为消息并不是实时处理的,那肯定会有一个存储消息,处理消息的地方,才能达到异步效果. 所 ...

  2. JAVA面试题:你怎么设计一个消息队列?

    1 面试题 写一个消息队列,你如何进行架构设计,说一下你的思路! 2 考点分析 一般面试官要考察两块: (1)你有没有对某一个消息队列做过较为深入的原理的了解,或者从整体了解把握住一个mq的架构原理 ...

  3. 什么鬼,面试官竟然让我用Redis实现一个消息队列!!?

    GitHub 9.4k Star 的Java工程师成神之路 ,不来了解一下吗? GitHub 9.4k Star 的Java工程师成神之路 ,真的不来了解一下吗? GitHub 9.4k Star 的 ...

  4. 面试官竟让我用Redis实现一个消息队列!

    来自公众号:Hollis >>>千人线上直播活动报名倒计时(今晚20:00): 从Oracle出发,走进GaussDB的世界 众所周知,redis是一个高性能的分布式key-valu ...

  5. 消息中间件系列(七):如何从0到1设计一个消息队列中间件

    消息队列作为系统解耦,流量控制的利器,成为分布式系统核心组件之一. 如果你对消息队列背后的实现原理关注不多,其实了解消息队列背后的实现非常重要. 不仅知其然还要知其所以然,这才是一个优秀的工程师需要具 ...

  6. UI线程和Windows消息队列

    在Windows应用程序中,窗体是由一种称为"UI线程(User Interface Thread)"的特殊类型的线程创建的. 首先,UI线程是一种"线程",所 ...

  7. 自已动手做高性能消息队列

    前言 本人觉得码农的技术提升应该是从how to do到why do,而项目或产品都是从why do到how to do,按题来,所以呢下面先从大的方面介绍一下消息队列. 消息队列是分布式高并发面目中 ...

  8. RTX线程通信之——消息队列

    文章目录 Message Queue 消息队列 RTX 消息队列 API 使用案例 小结 参考资料 Message Queue 我们知道,Thread and Event Flags.Semaphor ...

  9. java字符存储_用java的类集框架做一个字符存储器(15)

    11.这是java的关于java的类集框架做一个字符存储器的源代码可以直接进行编译运行,希望大家能够从中获益良多. package niming; //导入ArrayList这个类 import ja ...

  10. 高薪程序员面试题精讲系列127之如何设计一个消息队列?如何保证消息的执行顺序?

    一. 面试题及剖析 1. 今日面试题 如何保证消息队列中消息的执行顺序? RabbitMQ消息过期了怎么办? 如何设计一个消息队列? 如果让你自己设计一个消息队列,该怎么实现? 2. 题目剖析 壹哥在 ...

最新文章

  1. Centos Git1.7.1升级到Git2.2.1
  2. Linux系统卸载Apache(阿帕奇)环境教程
  3. 虚拟化系列-VMware vSphere 5.1 高可用性
  4. Delphi自定义过程获取本机ip,名字,用户名
  5. IE6.0、IE7.0 、FireFox 在样式中的不同写法.doc
  6. tinydate.js[v0.3] 新增了字符串格式化为日期对象的函数
  7. Centos7 下载、安装、配置、启动部署
  8. Python获取矢量文件属性表字段及类型
  9. gRPC 1.20.1 发布,谷歌开源的高性能 RPC 框架
  10. 电力101/104规约文件服务报文浅析
  11. 微pe工具箱是微软的吗_【 微PE工具箱 】微PE工具箱(系统工具)新版下载 - U大师...
  12. 阿里云 Aliplayer高级功能介绍(九):自动播放体验...
  13. 表格筛选后复制粘贴方法
  14. [UWP开发] Win10微博分享
  15. 使用深度图重建世界坐标
  16. 2021年焊工(初级)考试资料及焊工(初级)新版试题
  17. TCP粘包问题以及解决方法
  18. MAC压缩的文件在win下减压出来是空文件夹
  19. 感谢开源,让我的青春永不褪色!
  20. php获取上传图片的宽和高

热门文章

  1. .NET使用存储过程实现对数据库的增删改查
  2. 《结对-航空购票系统-开发环境搭建过程》
  3. c++ primer plus(第6版)中文版 第十二章编程练习答案
  4. typeof和instanceof的用法
  5. 第三方魔兽金币交易平台的影响力会很快地褪去
  6. 欧几里德算法(求最大公约数和最小公倍数)
  7. 遗传算法导论(转载)
  8. 基于蚁群算法求解求解TSP问题(JAVA)
  9. 拓端tecdat|Python风险价值计算投资组合VaR(Value at Risk )、期望损失ES(Expected Shortfall)
  10. 拓端tecdat|R语言动量交易策略分析调整后的数据