Java工具-延时队列

今天工作遇到了延时队列的问题,看了一下网上大多数人发布的延时队列工具类,发现他们的实现大多不通用要不就是太复杂且没实现多线程,使得程序运行一直处于阻塞状态。于是我写了个超级通用和简单的多线程延时队列工具类给大家分享一下。

使用的具体例子请看延时队列工具类的main方法。

延时队列实体类,定义执行任务和延时时间。

package com.hdq.tools;

import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;


/**
 * 延时队列实体类
 * @author Halo
 * expire表示延时执行的时间
 */
public abstract class DelayedEntity implements Delayed,Runnable {
    private long expire;
    public DelayedEntity(long expire) {
        this.expire=System.currentTimeMillis()+expire;
    }
    @Override
    public int compareTo(Delayed o) {
        // TODO Auto-generated method stub
        DelayedEntity obj=(DelayedEntity)o;
        if(this.expire>obj.expire)
            return 1;
        else if(this.expire<obj.expire)
            return -1;
        return 0;
    }

    @Override
    public long getDelay(TimeUnit unit) {
        // TODO Auto-generated method stub
        return expire-System.currentTimeMillis();
    }
    
    public static void startJob(DelayedEntity info) {
        new Thread(info).start();
    }
}

延时队列工具类

package com.hdq.tools;

import java.util.concurrent.DelayQueue;

/**
 * 延时队列工具类
 * @author Halo
 * addJob添加任务
 * startJob开始添加的任务
 * 使用的具体例子请看main方法
 */
public class DelayedQueue implements Runnable{
    DelayQueue<DelayedEntity> queue=new DelayQueue<>();

    @Override
    public void run() {
        // TODO Auto-generated method stub
        while(!queue.isEmpty()) {
            try {
                DelayedEntity.startJob(queue.take());
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    public void addJob(DelayedEntity entity) {
        queue.add(entity);
    }
    public void startJob() {
        new Thread(this).start(); 
    }
    public static void main(String args[]) {
        DelayedQueue queue=new DelayedQueue();
        final int a=3;
        queue.addJob(new DelayedEntity(a*1000) {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                System.out.println(a+"秒后显示该文字");
            }
        });
        final int b=6;
        queue.addJob(new DelayedEntity(b*1000) {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                System.out.println(b+"秒后显示该文字");
            }
        });
        queue.startJob();
    }
}

 

posted on 2022-04-11 21:17  Halone  阅读(323)  评论(0编辑  收藏  举报