Java的DelayQueue延迟队列简单使用代码实例

 更新时间:2023年12月13日 10:32:39   作者:Terisadeng  
这篇文章主要介绍了Java的DelayQueue延迟队列简单使用代码实例,DelayQueue是一个延迟队列,插入队列的数据只有达到设置的延迟时间时才能被取出,否则线程会被阻塞,插入队列的对象必须实现Delayed接口,需要的朋友可以参考下

DelayQueue延迟队列代码实例

DelayQueue是一个延迟队列,插入队列的数据只有达到设置的延迟时间时才能被取出,否则线程会被阻塞。

插入队列的对象必须实现Delayed接口,实现comapreTo方法和getDelay方法,其中getDelay方法用于设置对象延迟多少秒取出,compareTo用于对被延迟取出的数据进行排序

所以compareTo方法中一般调用对象的getDelay方法,根据对象的延迟时间进行排序。

首先是定义实现Delayed接口的类:

import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
/**
 * 实现Delayed接口,用于插入延迟阻塞队列
 * @author SN
 *
 */
public class Worker implements Delayed{
	private String name;
	private String workNo;
	private long startTime;
	private long endTime;
	public static final TimeUnit TIME_UNIT=TimeUnit.SECONDS;
	public Worker(String name,String workNo,long startTime,long endTime){
		this.name=name;
		this.workNo=workNo;
		this.startTime=startTime;
		this.endTime=endTime;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getWorkNo() {
		return workNo;
	}
	public void setWorkNo(String workNo) {
		this.workNo = workNo;
	}
	public long getStartTime() {
		return startTime;
	}
	public void setStartTime(long startTime) {
		this.startTime = startTime;
	}
	public long getEndTime() {
		return endTime;
	}
	public void setEndTime(long endTime) {
		this.endTime = endTime;
	}
	//排序方法,用于将插入队列的对象按延迟时间进行排序
	@Override
	public int compareTo(Delayed delayed) {
		Worker worker=(Worker) delayed;
		return (this.getDelay(TIME_UNIT)-worker.getDelay(TIME_UNIT))>0?1:0;
	}
	//延迟时间,用于确定取出队列中数据的时间
	@Override
	public long getDelay(TimeUnit unit) {
		return endTime-System.currentTimeMillis();
	}
}

然后是测试向DelayQueue插入数据和取出数据:

import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.concurrent.DelayQueue;
/**
 * 向延迟队列中插入数据,并在到达延迟时间时从队列中取出数据,否则就阻塞当前线程
 * @author SN
 *
 */
public class DelayQueueExp implements Runnable{
	private DelayQueue<Worker> queue=new DelayQueue<>();
	public boolean working=true;
	public static final SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	//向延迟队列中插入数据,并设置延迟取出的时间
	public void startWork(String name,String workNo,int grade){
		long time=System.currentTimeMillis();
		Date date=new Date(time);
		Worker worker=new Worker(name, workNo, System.currentTimeMillis(), grade*10000+time);
		System.out.println("员工"+worker.getName()+",工号"+worker.getWorkNo()+"于"+sdf.format(date)+"打卡上班...");
		this.queue.add(worker);
	}
	public void endWork(Worker worker){
		Date date=new Date(worker.getEndTime());
		System.out.println("员工"+worker.getName()+",工号"+worker.getWorkNo()+"于"+sdf.format(date)+"打卡下班...");
	}
	@Override
	public void run() {
		while (working) {
			try {
				//启动线程后,从延迟队列中取出数据,如果没有满足延迟时间条件的数据可以取出就阻塞住线程
				Worker worker=queue.take();
				endWork(worker);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	public static void main(String[] args) {
		System.out.println("员工开始打卡上班...");
		DelayQueueExp company=new DelayQueueExp();
		Thread work=new Thread(company);
		work.start();
		//向延迟队列中插入数据
		company.startWork("zhangsan", "1001", 1);
		company.startWork("lisi", "1002", 3);
		company.startWork("wanger", "1003", 5);
	}
}

到此这篇关于Java的DelayQueue延迟队列简单使用代码实例的文章就介绍到这了,更多相关DelayQueue延迟队列代码实例内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot + SpringSecurity 短信验证码登录功能实现

    SpringBoot + SpringSecurity 短信验证码登录功能实现

    这篇文章主要介绍了SpringBoot + SpringSecurity 短信验证码登录功能实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • maven私服的配置使用方法

    maven私服的配置使用方法

    这篇文章主要介绍了maven私服的配置使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Java透明窗体的设置方法

    Java透明窗体的设置方法

    在本文中我们给大家整理了关于Java透明窗体的设置方法以及需要注意的地方,需要的朋友们学习参考下。
    2019-03-03
  • AbstractQueuedSynchronizer内部类Node使用讲解

    AbstractQueuedSynchronizer内部类Node使用讲解

    这篇文章主要为大家介绍了AbstractQueuedSynchronizer内部类Node使用讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • 一篇文章带你搞定SpringBoot不重启项目实现修改静态资源

    一篇文章带你搞定SpringBoot不重启项目实现修改静态资源

    这篇文章主要介绍了一篇文章带你搞定SpringBoot不重启项目实现修改静态资源,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java实现定时读取json文件里内容的示例代码

    Java实现定时读取json文件里内容的示例代码

    有时候我们会需要定时来读取JSON配置文件里的内容,来执行一些业务逻辑上的操作,本文就介绍了Java实现定时读取json文件里内容的示例代码,感兴趣的可以了解一下
    2023-08-08
  • Elasticsearch索引库和文档的相关操作详细指南

    Elasticsearch索引库和文档的相关操作详细指南

    这篇文章主要给大家介绍了关于Elasticsearch索引库和文档的相关操作的相关资料,Elasticsearch是用Java开发并且是当前最流行的开源的企业级搜索引擎,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • Spring AOP如何在注解上使用SPEL表达式注入对象

    Spring AOP如何在注解上使用SPEL表达式注入对象

    这篇文章主要介绍了Spring AOP如何在注解上使用SPEL表达式注入对象,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • java this 用法详解及简单实例

    java this 用法详解及简单实例

    这篇文章主要介绍了java this 用法详解及简单实例的相关资料,需要的朋友可以参考下
    2017-03-03
  • spring boot使用thymeleaf为模板的基本步骤介绍

    spring boot使用thymeleaf为模板的基本步骤介绍

    Spring Boot项目的默认模板引擎是Thymeleaf,这没什么好说的,个人觉得也非常好,下面这篇文章主要给大家介绍了关于spring boot使用thymeleaf为模板的相关资料,需要的朋友可以参考借鉴,下面来一起学习学习吧。
    2018-01-01

最新评论