delayqueue

DelayQueue队列

本秂侑毒 提交于 2020-01-07 16:04:30
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> DelayQueue是一个支持延时获取元素的无界阻塞队列。队列中的元素必须实现Delayed接口,在创建元素的时候可以指定多久才能从队列中获取当前元素,只有在延迟期满时才能从队列中获取元素。 我们可以将DelayQueue运用在以下应用场景: 缓存系统的设计:可以用DelayQueue保存缓存元素的有效期,使用一个线程循环查询DelayQueue,一旦能从DelayQueue中获取元素时,表示缓存有效期到了。 定时任务调度:使用DelayQueue保存当天将会执行的任务和执行时间,一旦从DelayQueue中获取到任务就开始执行,从比如TimerQueue就是使用DelayQueue实现的。 ——以上摘自Java并发编程的艺术 下面是自已撸的一个小栗子 1、用于执行通知任务的队列元素 package com.dreyer.concurrent; import java.util.concurrent.Delayed; import java.util.concurrent.TimeUnit; /** * @description 通知延迟队列 * @author: Dreyer * @date: 16/4/27 下午2:40 */ public class NotifyTask implements

BlockingQueue

故事扮演 提交于 2019-12-10 18:33:45
1. 什么是阻塞队列? 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。 阻塞队列提供了四种处理方法: 方法\处理方式 抛出异常 返回特殊值 一直阻塞 超时退出 插入方法 add(e) offer(e) put(e) offer(e,time,unit) 移除方法 remove() poll() take() poll(time,unit) 检查方法 element() peek() 不可用 不可用 异常:是指当阻塞队列满时候,再往队列里插入元素,会抛出IllegalStateException("Queue full")异常。当队列为空时,从队列里获取元素时会抛出NoSuchElementException异常 。 返回特殊值:插入方法会返回是否成功,成功则返回true。移除方法,则是从队列里拿出一个元素,如果没有则返回null 一直阻塞:当阻塞队列满时,如果生产者线程往队列里put元素,队列会一直阻塞生产者线程,直到拿到数据,或者响应中断退出。当队列空时,消费者线程试图从队列里take元素

Java多线程-工具篇-BlockingQueue

走远了吗. 提交于 2019-12-04 18:48:42
前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景。 认识BlockingQueue 阻塞队列,顾名思义,首先它是一个队列,而一个队列在数据结构中所起的作用大致如下图所示: 从上图我们可以很清楚看到,通过一个共享的队列,可以使得数据由队列的一端输入,从另外一端输出; 常用的队列主要有以下两种:(当然通过不同的实现方式,还可以延伸出很多不同类型的队列,DelayQueue就是其中的一种)   先进先出(FIFO):先插入的队列的元素也最先出队列,类似于排队的功能。从某种程度上来说这种队列也体现了一种公平性。   后进先出(LIFO):后插入队列的元素最先出队列,这种队列优先处理最近发生的事件。 多线程环境中,通过队列可以很容易实现数据共享,比如经典的“生产者”和“消费者”模型中,通过队列可以很便利地实现两者之间的数据共享。假设我们有若干生产者线程,另外又有若干个消费者线程。如果生产者线程需要把准备好的数据共享给消费者线程,利用队列的方式来传递数据,就可以很方便地解决他们之间的数据共享问题。但如果生产者和消费者在某个时间段内

浅谈DelayQueue的使用

a 夏天 提交于 2019-12-04 09:08:11
首先,DelayQueue是一个无界阻塞队列,只有在延迟期满时才能从中提取元素。可以设置该队列的存活时间、移除时间、唯一ID等元素。 DelayQueue阻塞队列在我们系统开发中也常常会用到,例如:延迟多久执行某操作;任务调度系统,能够准确的把握任务的执行时间。为了具有调用行为,存放到DelayDeque的元素必须继承Delayed接口。Delayed接口使对象成为延迟对象,它使存放在DelayQueue类中的对象具有了激活日期。 CompareTo(Delayed o):Delayed接口继承了Comparable接口,因此有了这个方法。 getDelay(TimeUnit unit):这个方法返回到激活日期的剩余时间,时间单位由单位参数指定。 new DelayedItem(T t, Long liveTime, String id)--构造函数,之后附上代码。 public class DelayEvent<T extends Runnable> implements Delayed { private T t; private Long liveTime ; private Long removeTime; private String id; private static final AtomicLong atomic = new AtomicLong(0);

DelayQueue延迟队列-实现缓存

空扰寡人 提交于 2019-12-03 05:35:38
延迟阻塞队列DelayQueue DelayQueue 是一个支持延时获取元素的阻塞队列, 内部采用优先队列 PriorityQueue 存储元素, 同时元素必须实现 Delayed 接口;在创建元素时可以指定多久才可以从队列中获取当前元素,只有在延迟期满时才能从队列中提取元素。 使用场景 缓存系统:当能够从延迟队列DelayQueue中获取到元素时,说明缓存已经过期 定时任务调度:一分钟后发送短信 基于延迟队列,实现一个缓存系统 延迟队列中添加的元素,实现了Delayed接口 public class CacheItem implements Delayed{ private long expireTime; private long currentTime; private String key; public String getKey() { return key; } public CacheItem(String key,long expireTime) { this.key = key; this.expireTime = expireTime; this.currentTime = System.currentTimeMillis(); } /** * 比较方法,用于排序 * 过期时间长的放队尾,时间短的放队首 */ @Override public int

kafka面试题

匿名 (未验证) 提交于 2019-12-03 00:13:02
1 什么是kafka Kafka是分布式发布-订阅消息系统,它最初是由LinkedIn公司开发的,之后成为Apache项目的一部分,Kafka是一个分布式,可划分的,冗余备份的持久性的日志服务,它主要用于处理流式数据。 2 为什么要使用 kafka,为什么要使用消息队列 缓冲和削峰:上游数据时有突发流量,下游可能扛不住,或者下游没有足够多的机器来保证冗余,kafka在中间可以起到一个缓冲的作用,把消息暂存在kafka中,下游服务就可以按照自己的节奏进行慢慢处理。 解耦和扩展性:项目开始的时候,并不能确定具体需求。消息队列可以作为一个接口层,解耦重要的业务流程。只需要遵守约定,针对数据编程即可获取扩展能力。 冗余:可以采用一对多的方式,一个生产者发布消息,可以被多个订阅topic的服务消费到,供多个毫无关联的业务使用。 健壮性:消息队列可以堆积请求,所以消费端业务即使短时间死掉,也不会影响主要业务的正常进行。 异步通信:很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。 3.Kafka中的ISR、AR又代表什么?ISR的伸缩又指什么 ISR:In-Sync Replicas 副本同步队列 AR:Assigned Replicas 所有副本

Java中的阻塞队列_BlockingQueue

这一生的挚爱 提交于 2019-12-02 08:37:38
Java中的阻塞队列_BlockingQueue 1. 什么是阻塞队列? 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。 这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。 阻塞队列提供了四种处理方法: 抛出异常:是指当阻塞队列满时候,再往队列里插入元素,会抛出IllegalStateException("Queue full")异常。当队列为空时,从队列里获取元素时会抛出NoSuchElementException异常 。 返回特殊值:插入方法会返回是否成功,成功则返回true。移除方法,则是从队列里拿出一个元素,如果没有则返回null 一直阻塞:当阻塞队列满时,如果生产者线程往队列里put元素,队列会一直阻塞生产者线程,直到拿到数据,或者响应中断退出。当队列空时,消费者线程试图从队列里take元素,队列也会阻塞消费者线程,直到队列可用。 超时退出:当阻塞队列满时,队列会阻塞生产者线程一段时间,如果超过一定的时间,生产者线程就会退出。 2. Java里的阻塞队列 一个 BlockingQueue 可能是有界的,如果在插入的时候,发现队列满了

java中延迟任务的处理方式

别来无恙 提交于 2019-12-01 07:11:37
1、利用延迟队列 延时队列,第一他是个队列,所以具有对列功能第二就是延时,这就是延时对列,功能也就是将任务放在该延时对列中,只有到了延时时刻才能从该延时对列中获取任务否则获取不到…… 应用场景比较多,比如延时1分钟发短信,延时1分钟再次执行等,下面先看看延时队列demo之后再看延时队列在项目中的使用: 简单的延时队列要有三部分:第一实现了Delayed接口的消息体、第二消费消息的消费者、第三存放消息的延时队列,那下面就来看看延时队列demo。 一、消息体 package com.delqueue; import java.util.concurrent.Delayed; import java.util.concurrent.TimeUnit; /** * 消息体定义 实现Delayed接口就是实现两个方法即compareTo 和 getDelay最重要的就是getDelay方法,这个方法用来判断是否到期…… */ public class Message implements Delayed { private int id; private String body; // 消息内容 private long excuteTime;// 延迟时长,这个是必须的属性因为要按照这个判断延时时长。 public int getId() { return id; } public

BlockingQueu 阻塞队列

孤街醉人 提交于 2019-11-29 13:37:41
java.util.concurrent public interface BlockingQueue<E> extends Queue<E> 简介 当阻塞队列插入数据时: 如果队列已经满了,线程则会阻塞等待队列中元素被取出后在插入。 当从阻塞队列中取数据时,如果队列是空的,则线程会阻塞等待队列中有新元素。 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列: 这两个附加的操作是: 在队列为空时,获取元素的线程会等待队列变为非空。 当队列满时,存储元素的线程会等待队列可用。 阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。 阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。 ArrayBlockingQueue : 一个由数组结构组成的有界阻塞队列(实现的接口是 BlockingQueue)。 LinkedBlockingQueue : 一个由链表结构组成的有界阻塞队列(实现的接口是 BlockingQueue)。 PriorityBlockingQueue : 一个支持优先级排序的无界阻塞队列(实现的接口是 BlockingQueue)。 DelayQueue: 一个使用优先级队列实现的无界阻塞队列(实现的接口是 BlockingQueue)。 SynchronousQueue:

多线程编程学习六(Java 中的阻塞队列).

半腔热情 提交于 2019-11-29 05:36:11
介绍 阻塞队列(BlockingQueue)是指当队列满时,队列会阻塞插入元素的线程,直到队列不满;当队列空时,队列会阻塞获得元素的线程,直到队列变非空。阻塞队列就是生产者用来存放元素、消费者用来获取元素的容器。 当线程 插入/获取 动作由于队列 满/空 阻塞后,队列也提供了一些机制去处理,或抛出异常,或返回特殊值,或者线程一直等待... 方法/处理方式 抛出异常 返回特殊值 一直阻塞 超时退出 插入方法 add(e) offer(e) put(e) offer(e, timeout, unit) 移除方法 remove(o) poll() take() poll(timeout, unit) 检查方法 element() peek() — 不移除元素 不可用 不可用 tips: 如果是无界阻塞队列,则 put 方法永远不会被阻塞;offer 方法始终返回 true。 Java 中的阻塞队列: ArrayBlockingQueue ArrayBlockingQueue 是一个用数组实现的有界阻塞队列。此队列按照先进先出(FIFO)的原则对元素进行排序,默认情况下不保证线程公平的访问。 通过可重入的独占锁 ReentrantLock 来控制并发,Condition 来实现阻塞。 public class ArrayBlockingQueueTest { /** * 1.