当前位置: 首页 > 编程笔记 >

java中DelayQueue实例用法详解

姜永贞
2023-03-14
本文向大家介绍java中DelayQueue实例用法详解,包括了java中DelayQueue实例用法详解的使用技巧和注意事项,需要的朋友参考一下

在阻塞队里中,除了对元素进行增加和删除外,我们可以把元素的删除做一个延迟的处理,即使用DelayQueue的方法。这里的删除需要一定的时间才能生效,有点类似于过期处理的理念。下面我们就DelayQueue的概念、特点进行讲解,然后在代码示例中体会DelayQueue的使用。

1.概念

是一个带有延迟时间的无界阻塞队列。队列中的元素,只有等延时时间到了,才能取出来。此队列一般用于过期数据的删除,或任务调度。以下,模拟一下定长时间的数据删除。

2.特点

(1)无边界设计

(2)添加(put)不阻塞,移除阻塞

(3)元素都有一个过期时间

(4)取元素只有过期的才会被取出

3.实例

每个需要放入DelayQueue队列元素需要实现Delayed接口,下面我们创建DelayObject 类,其实例对象将被放入DelayQueue中。其构造函数包括字符串类型数据及延迟毫秒变量。

public class DelayObject implements Delayed {
  private String data;
  private long startTime;
  public DelayObject(String data, long delayInMilliseconds) {
    this.data = data;
    this.startTime = System.currentTimeMillis() + delayInMilliseconds;
}

DelayQueue的应用实例

package org.dromara.hmily.demo.springcloud.account.service;
 
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
 
/**
 * @description: 延时队列测试
 * @author: hh
 */
public class DelayedQueneTest {
 
  public static void main(String[] args) throws InterruptedException {
    Item item1 = new Item("item1", 5, TimeUnit.SECONDS);
    Item item2 = new Item("item2",10, TimeUnit.SECONDS);
    Item item3 = new Item("item3",15, TimeUnit.SECONDS);
    DelayQueue<Item> queue = new DelayQueue<>();
    queue.put(item1);
    queue.put(item2);
    queue.put(item3);
    System.out.println("begin time:" + LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
    for (int i = 0; i < 3; i++) {
      Item take = queue.take();
      System.out.format("name:{%s}, time:{%s}\n",take.name, LocalDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME));
    }
  }
 
}
 
class Item implements Delayed{
  /* 触发时间*/
  private long time;
  String name;
 
  public Item(String name, long time, TimeUnit unit) {
    this.name = name;
    this.time = System.currentTimeMillis() + (time > 0? unit.toMillis(time): 0);
  }
 
  @Override
  public long getDelay(TimeUnit unit) {
    return time - System.currentTimeMillis();
  }
 
  @Override
  public int compareTo(Delayed o) {
    Item item = (Item) o;
    long diff = this.time - item.time;
    if (diff <= 0) {// 改成>=会造成问题
      return -1;
    }else {
      return 1;
    }
  }
 
  @Override
  public String toString() {
    return "Item{" +
        "time=" + time +
        ", name='" + name + '\'' +
        '}';
  }
}

运行结果:每5秒取出一个

begin time:2019-05-31T11:58:24.445
name:{item1}, time:{2019-05-31T11:58:29.262}
name:{item2}, time:{2019-05-31T11:58:34.262}
name:{item3}, time:{2019-05-31T11:58:39.262}

到此这篇关于java中DelayQueue实例用法详解的文章就介绍到这了,更多相关java中DelayQueue是什么内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!

 类似资料:
  • 本文向大家介绍详解java中DelayQueue的使用,包括了详解java中DelayQueue的使用的使用技巧和注意事项,需要的朋友参考一下 简介 今天给大家介绍一下DelayQueue,DelayQueue是BlockingQueue的一种,所以它是线程安全的,DelayQueue的特点就是插入Queue中的数据可以按照自定义的delay时间进行排序。只有delay时间小于0的元素才能够被取出

  • 本文向大家介绍Java 中This用法的实例详解,包括了Java 中This用法的实例详解的使用技巧和注意事项,需要的朋友参考一下  Java 中This用法的实例详解 用类名定义一个变量的时候,定义的只是一个引用,外面可以通过这个引用来访问这个类里面的属性和方法。     那们类里面是够也应该有一个引用来访问自己的属性和方法纳?     呵呵,Java提供了一个很好的东西,就是 this 对象,

  • 本文向大家介绍java中Calendar类用法实例详解,包括了java中Calendar类用法实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了java中Calendar类用法。分享给大家供大家参考,具体如下: java中的Calendar在开发中经常被忽略,这篇博客总结一下这个类,对后面项目中使用时期的时候有帮助。 Calendar常量(field)的作用 总结: 1)常量的真正意

  • 本文向大家介绍Java中Arrays.asList()方法详解及实例,包括了Java中Arrays.asList()方法详解及实例的使用技巧和注意事项,需要的朋友参考一下 Arrays.asList() 是将数组作为列表。 问题来源于: 期望的输出是 list 里面也有4个元素,也就是 size 为4,然而结果是1。 原因如下: 在 Arrays.asList 中,该方法接受一个变长参数,一般可看

  • 本文向大家介绍详解java枚举用法及实例,包括了详解java枚举用法及实例的使用技巧和注意事项,需要的朋友参考一下 一、枚举类型作为常量 其实在更近一步的话我们可以输出每个枚举实例的具体位置 二、与swith结合使用 从上面的例子可以看出枚举的多态性,其实可以讲Color作为枚举的超类,其中的实例在运行时表现出多态。(如上面的输出结果为红色,下面的例子来验证这一特性。) 三、多态性(在Color中

  • 本文向大家介绍js中this用法实例详解,包括了js中this用法实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了js中this用法。分享给大家供大家参考。具体如下: 1. 指向window 全局变量 全局函数 2. 指向该对象(在全局里面this指向window,在某个对象里面this指向该对象,在闭包里面this指向window) 3. 用apply,call改变函数的this