DelayQueue使用
来源:互联网 发布:编程原本 评价 编辑:程序博客网 时间:2024/06/06 04:52
- 使用延迟队列的元素必须实现Delayed接口
public class Task implements Delayed { /** * 到期时间,单位是秒 */ private final long timeOut; /** * 问题对象 */ private final Question question; /** * 产生序列号 */ private static final AtomicLong atomic = new AtomicLong(0); /** * 序列号 */ private final long sequenceNum; public Task(long timeout, Question question) { this.timeOut = System.nanoTime() + TimeUnit.NANOSECONDS.convert(timeout, TimeUnit.SECONDS); this.question = question; this.sequenceNum = atomic.getAndIncrement(); } /** * 返回与此对象相关的剩余延迟时间,以给定的时间单位表示 */ @Override public long getDelay(TimeUnit unit) { return unit.convert(this.timeOut - System.nanoTime(), TimeUnit.NANOSECONDS); } /** * 元素的先后顺序 * @param other * @return */ @Override public int compareTo(Delayed other) { if (other == this) // compare zero ONLY if same object return 0; if (other instanceof Task) { Task x = (Task) other; long diff = timeOut - x.timeOut; if (diff < 0) return -1; else if (diff > 0) return 1; else if (sequenceNum < x.sequenceNum) return -1; else return 1; } long d = (getDelay(TimeUnit.NANOSECONDS) - other.getDelay(TimeUnit.NANOSECONDS)); return (d == 0) ? 0 : ((d < 0) ? -1 : 1); } public Question getQuestion() { return question; }}
- 任务对象
public class Question { private boolean resloved; private String number; public Question(boolean resloved, String number) { this.resloved = resloved; this.number = number; } public void setResloved(boolean resloved) { this.resloved = resloved; } @Override public String toString() { return "Question{" + "resloved=" + resloved + ", number='" + number + '\'' + '}'; }}
- 执行任务
import java.util.concurrent.DelayQueue;/** * Created by Administrator on 2017/5/26. */public class Job { private Thread daemonThread; private DelayQueue<Task> delayQueue = new DelayQueue<Task>(); public Job(){ Runnable daemonTask = new DaemonThread(); daemonThread = new Thread(daemonTask); daemonThread.setName("Cache Daemon"); daemonThread.start(); } //执行线程 class DaemonThread implements Runnable{ @Override public void run() { execute(); } } /** * 添加任务, * time 延迟时间,时间是秒 * q 问题 * 用户为问题设置延迟时间 */ public void put(long time,Question q){ //创建一个任务 Task k = new Task(time,q); //将任务放在延迟的队列中 delayQueue.put(k); } public void execute(){ System.out.println("start"); while(true) { try { //从延迟队列中取值,如果没有对象过期则队列一直等待, Task t1 = delayQueue.poll(); if (t1 != null) { //修改问题的状态 Question q = t1.getQuestion(); System.out.println("修改前"+q); q.setResloved(true); System.out.println("修改后"+q); } } catch (Exception e) { e.printStackTrace(); break; } } } public static void main(String[] args) { Job job = new Job(); Question question1 = new Question(false,"00888"); job.put(5,question1); for (int i = 0; i < 10; i++){ Question question = new Question(false,"00"+i); job.put(5,question); } }}
阅读全文
0 0
- DelayQueue使用
- DelayQueue的简单使用
- DelayQueue的使用
- DelayQueue使用示例
- DelayQueue
- DelayQueue
- DelayQueue
- DelayQueue
- DelayQueue
- DelayQueue
- DelayQueue
- DelayQueue
- delayqueue
- DelayQueue
- DelayQueue延时队列的使用
- DelayQueue延时队列的使用
- 延迟队列DelayQueue的使用示例
- 【Java】3.DelayQueue使用与分析
- 架构的本质是管理复杂性,微服务本身也是架构演化的结果
- 基于SRS的RTMP分发技术方案
- 1053. 住房空置率 (20) PAT
- java中static和final的区别
- 504. Base 7
- DelayQueue使用
- C++虚函数及虚函数表解析
- ssh连接慢-to escape to local shell
- yii2学习之后台yiicms
- VMware12 Pro上安装OS X 10.8苹果系统
- IE8下兼容rgba颜色的半透明背景
- 单元测试及博主相关文章都挺好
- recyclerview_helper多功能封装,让你应用更加自如
- IE8下jQuery改变png图片透明度时出现的黑边问题