• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

无信不立

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

【java多线程】队列系统之DelayQueue源码

一、延迟队列

延迟队列,底层依赖了优先级队列PriorityBlockingQueue

二、延迟队列案例

(1)延迟队列的任务

public class DelayTask implements Delayed {

    /**
     * 要执行的任务
     */
    private String doTask;

    /**
     * 任务要执行的时间
     */
    private Date date;


    /**
     * 还剩多长时间,开始执行任务
     * @param unit
     * @return
     */
    @Override
    public long getDelay(TimeUnit unit) {
        return unit.convert(date.getTime()-System.currentTimeMillis(),unit) ;
    }

    /**
     * 当前对象,跟其他延时任务比,谁更先被触发
     * @param o
     * @return
     */
    @Override
    public int compareTo(Delayed o) {
        if(o instanceof DelayTask){
           Date otherDate= ((DelayTask) o).getDate();
           long a= date.getTime()-otherDate.getTime();
           if(a>0){
               return 1;
           }else if(a<0){
               return -1;
           }else{
               return 0;
           }
        }else{
            throw new RuntimeException("队列数据异常");
        }
    }

    public String getDoTask() {
        return doTask;
    }

    public void setDoTask(String doTask) {
        this.doTask = doTask;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }
}
View Code

(2)延迟队列的消费线程

public class DelayTaskThread extends Thread{

private DelayQueue<DelayTask> delayTasksQueue;


public DelayTaskThread(DelayQueue<DelayTask> delayTasksQueue ){
    this.delayTasksQueue=delayTasksQueue;
}

    @Override
    public void run() {
        System.out.println("===========线程开始运行=====");
       while (true){
           try {
               DelayTask delayTask=delayTasksQueue.take();
               System.out.println(DateFormatUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss")+"获取任务成功");
               Date date =delayTask.getDate();
               String task=delayTask.getDoTask();
               System.out.println(DateFormatUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss")+"=====>要执行的任务内容为【"+task+"】到期时间为【"+ DateFormatUtils.format(date,"yyyy-MM-dd HH:mm:ss")+"】");
               Arrays.asList("a","b");
           } catch (InterruptedException e) {
               e.printStackTrace();
           }catch (Exception e){
               e.printStackTrace();
           }
       }
    }
}
View Code

 

posted on 2019-04-03 15:11  无信不立  阅读(292)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3