zoukankan      html  css  js  c++  java
  • java RedoHandler

    package org.rx.bot.util;
    
    import lombok.Getter;
    import lombok.Setter;
    import org.jetbrains.annotations.NotNull;
    import org.rx.core.Disposable;
    import org.rx.core.Tasks;
    import org.rx.util.function.BiAction;
    
    import java.util.concurrent.DelayQueue;
    import java.util.concurrent.Delayed;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.atomic.AtomicInteger;
    
    import static org.rx.core.App.quietly;
    import static org.rx.core.App.require;
    
    public class RedoHandler<T> extends Disposable {
        public static class RedoData<T> implements Delayed {
            @Getter
            @Setter
            private T data;
            private long delayMillis, elapsedTime;
            @Getter
            @Setter
            private volatile boolean done;
            private final AtomicInteger redoCount = new AtomicInteger();
    
            public RedoData(T data, long delayMillis) {
                this.data = data;
                this.delayMillis = delayMillis;
                renew();
            }
    
            private RedoData<T> renew() {
                elapsedTime = System.currentTimeMillis() + delayMillis;
                return this;
            }
    
            @Override
            public long getDelay(@NotNull TimeUnit unit) {
                return unit.convert(elapsedTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
            }
    
            @Override
            public int compareTo(@NotNull Delayed o) {
    //            return (int) (this.getDelay(TimeUnit.MILLISECONDS) - o.getDelay(TimeUnit.MILLISECONDS));
    //            // 过期时间长的放置在队列尾部
    //            if (this.getDelay(TimeUnit.MICROSECONDS) > o.getDelay(TimeUnit.MICROSECONDS)) {
    //                return 1;
    //            }
    //            // 过期时间短的放置在队列头
    //            if (this.getDelay(TimeUnit.MICROSECONDS) < o.getDelay(TimeUnit.MICROSECONDS)) {
    //                return -1;
    //            }
    //            return 0;
                return Long.compare(this.getDelay(TimeUnit.MICROSECONDS), o.getDelay(TimeUnit.MICROSECONDS));
            }
        }
    
        @Setter
        private int maxRedoCount = 1;
        private final DelayQueue<RedoData<T>> queue = new DelayQueue<>();
    
        public RedoHandler(BiAction<RedoData<T>> redoCallback) {
            require(redoCallback);
    
            Tasks.run(() -> {
                while (!isClosed()) {
                    RedoData<T> redoData = queue.take();
                    if (redoData.done || redoData.redoCount.get() >= maxRedoCount) {
                        continue;
                    }
                    redoData.redoCount.incrementAndGet();
                    quietly(() -> redoCallback.invoke(redoData));
                    queue.offer(redoData.renew());
                }
            });
        }
    
        @Override
        protected void freeObjects() {
        }
    
        public RedoData<T> monitor(T data, long redoMillis) {
            RedoData<T> redoData = new RedoData<>(data, redoMillis);
            queue.offer(redoData);
            return redoData;
        }
    }
    

      

  • 相关阅读:
    Quartz2D复习(三) --- 涂鸦
    Quartz2D复习(二) --- 手势解锁
    Quartz2D复习(一)--- 基础知识 / 绘制线段圆弧 / 图片水印 / 截图
    控制器和应用数据存储
    UIApplication
    setTimeout和setInterval
    工作中碰到的js问题(disabled表单元素不能提交到服务器)
    通知
    UITableViewController和延时执行、自定义控件
    将博客搬至CSDN
  • 原文地址:https://www.cnblogs.com/Googler/p/14451932.html
Copyright © 2011-2022 走看看