zoukankan      html  css  js  c++  java
  • 延迟队列

    1 任务类

    public class WorkerA implements Runnable {
        @Override
        public void run() {
            //相关业务逻辑处理
            System.out.println(Thread.currentThread().getName() + "A业务处理");
        }
    }
    
    public class WorkerB implements Runnable {
        @Override
        public void run() {
            //相关业务逻辑处理
            System.out.println(Thread.currentThread().getName() + "B业务处理");
        }
    }

    2 按照任务类组装的消息体类

    import java.util.concurrent.Delayed;
    import java.util.concurrent.TimeUnit;
    
    public class DelayOrderTask<T extends Runnable> implements Delayed {
    
        private final long delay;
        private final T task;
    
        public DelayOrderTask(long timeout, T task) {
            this.delay = System.nanoTime() + timeout;
            this.task = task;
        }
    
        @Override
        public long getDelay(TimeUnit unit) {
            return unit.convert(this.delay - System.nanoTime(), TimeUnit.NANOSECONDS);
        }
    
        @Override
        public int compareTo(Delayed o) {
            return (int) (this.getDelay(TimeUnit.MILLISECONDS) - o.getDelay(TimeUnit.MILLISECONDS));
        }
    
        public T getTask() {
            return task;
        }
    }

     3 延迟队列管理类

    public class DelayOrderQueueManager {
    
        private static final int DEFAULT_THREAD_NUM = 5;
    
        /**
         * 固定大小线程池
         */
        private static final ExecutorService executor = Executors.newFixedThreadPool(DEFAULT_THREAD_NUM);
    
        /**
         * 延时队列
         */
        private static final DelayQueue<DelayOrderTask<?>> delayQueue = new DelayQueue<>();
    
        private static final DelayOrderQueueManager instance = new DelayOrderQueueManager();
    
        public static DelayOrderQueueManager getInstance() {
            return instance;
        }
    
        private DelayOrderQueueManager() {
            // 守护线程
            Thread daemonThread = new Thread(this::execute);
            daemonThread.setName("DelayQueueMonitor");
            daemonThread.start();
        }
    
        private void execute() {
            while (true) {
                try {
                    DelayOrderTask<?> delayOrderTask = delayQueue.take();
                    Runnable task = delayOrderTask.getTask();
                    if (null == task) {
                        continue;
                    }
                    executor.execute(task);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    
        /**
         * 添加任务
         *
         * @param task
         * @param time 延时时间
         * @param unit 时间单位
         */
        public void put(Runnable task, long time, TimeUnit unit) {
            // 获取延时时间
            long timeout = TimeUnit.NANOSECONDS.convert(time, unit);
            // 将任务封装成实现Delayed接口的消息体
            DelayOrderTask<?> delayOrder = new DelayOrderTask<>(timeout, task);
            // 将消息体放到延时队列中
            delayQueue.put(delayOrder);
        }
        public void put(DelayOrderTask<?> delayOrder){
            delayQueue.put(delayOrder);
        }
    
        /**
         * 删除任务
         *
         * @param task
         * @return
         */
        public boolean removeTask(DelayOrderTask<?> delayOrder) {
            return delayQueue.remove(delayOrder);
        }
    }

    Test 

    public class Test {
        public static void main(String[] args) {
            // 延迟队列管理类,将任务转化消息体并将消息体放入延迟对列中等待执行
            DelayOrderQueueManager manager = DelayOrderQueueManager.getInstance();
    
            DelayOrderTask<?> t1 = new DelayOrderTask<>(TimeUnit.NANOSECONDS.convert(1000, TimeUnit.MILLISECONDS), new WorkerA());
    //        DelayOrderTask<?> t2 = new DelayOrderTask<>(TimeUnit.NANOSECONDS.convert(2000, TimeUnit.MILLISECONDS), new WorkerA());
    //        DelayOrderTask<?> t3 = new DelayOrderTask<>(TimeUnit.NANOSECONDS.convert(3000, TimeUnit.MILLISECONDS), new WorkerB());
    //        DelayOrderTask<?> t4 = new DelayOrderTask<>(TimeUnit.NANOSECONDS.convert(4000, TimeUnit.MILLISECONDS), new WorkerA());
    
            manager.put(t1);
            manager.put(t1);
            manager.put(t1);
            manager.put(t1);
    
            manager.removeTask(t1);
            manager.removeTask(t1);
            manager.removeTask(t1);
            manager.removeTask(t1);
        }
    }
  • 相关阅读:
    memset
    无穷大无穷小的表示方法
    堆-STL
    3386 二分图 洛谷luogu [模版]
    jquery——幻灯片(只动一屏)
    jquery——整屏滚动
    jquery——元素节点操作
    jquery——事件冒泡、事件委托
    jquery——解决鼠标移入移出导致盒子不停移动的bug
    jquery——无缝滚动
  • 原文地址:https://www.cnblogs.com/xiaomaoyvtou/p/14875072.html
Copyright © 2011-2022 走看看