Java的DelayQueue延迟队列简单使用代码实例
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结合maven配置不同环境的profile方式
这篇文章主要介绍了springboot结合maven配置不同环境的profile方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-01-01
SpringCloud Config统一配置中心问题分析解决与客户端动态刷新实现
springcloud config是一个解决分布式系统的配置管理方案。它包含了 client和server两个部分,server端提供配置文件的存储、以接口的形式将配置文件的内容提供出去,client端通过接口获取数据、并依据此数据初始化自己的应用2022-10-10
Java中使用LocalDate根据日期来计算年龄的实现方法
这篇文章主要介绍了Java中使用LocalDate根据日期来计算年龄的实现方法,需要的朋友可以参考下2018-01-01
eclipse 如何创建 user library 方法详解
这篇文章主要介绍了eclipse 如何创建 user library 方法详解的相关资料,需要的朋友可以参考下2017-04-04
Spring @RequestMapping 注解及使用技巧详解
@RequestMapping是Spring MVC 中定义请求映射规则的核心注解,用于将HTTP请求映射到Controller处理方法,下面给大家介绍Spring @RequestMapping 注解及使用技巧,感兴趣的朋友一起看看吧2025-06-06
使用@RequiredArgsConstructor注解来取代繁琐的@Autowrired
有了@RequiredArgsConstructor注解,我们就可以减少@Autowired的书写,本文主要介绍了使用@RequiredArgsConstructor注解来取代繁琐的@Autowrired,感兴趣的可以了解一下2022-04-04
Java使用try-with-resources实现自动解锁
项目中使用Redission分布式锁,每次使用都需要显示的解锁,很麻烦,Java 提供了 try-with-resources 语法糖,它不仅可以用于自动关闭流资源,还可以用于实现自动解锁,本文将介绍如何利用 try-with-resources 实现锁的自动释放,需要的朋友可以参考下2025-01-01


最新评论