面试手撕代码-利用延时队列实现单账户登录

该代码总结自电网敏感信息识别项目,特此分享
利用延时队列实现单账户登录

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

public class LoginDalayQueue implements Runnable{
    private Thread thread;
    private DelayQueue<People> delayQueue = new DelayQueue<>();
    private static LoginDalayQueue  loginDalayQueue = null;
    // 锁对象
    private static Object object = new Object();

    public static LoginDalayQueue getLoginDalayQueue(){
        // 双重检查锁机制 获取本对象
        if (loginDalayQueue == null) {
            synchronized (object) {
                if (loginDalayQueue == null) {
                    loginDalayQueue = new LoginDalayQueue();
                }
            }
        }
        loginDalayQueue.start();
        return loginDalayQueue;
      }

    private void start() {
        // 双重检查锁机制 获取线程对象,并启动线程
        if (thread == null) {
            synchronized (object) {
                if (thread == null) {
                    // 初始化
                    thread = new Thread(this);
                    thread.start();
                }
            }
        }
    }

    // 当登录时,将用户账户进行封装成People,存放在延时队列中
    private synchronized boolean addEle(String username){
        People people = new People(username);
        if(delayQueue.contains(people)){
            return false;
        }
        delayQueue.add(people);
        return true;
    }

    // 提供一个静态方法
    public static boolean addElement(String username){
        // 作用 仅仅是保证LoginDalayQueue对象存在
        LoginDalayQueue queue = null;
        if (loginDalayQueue == null) {
            queue = LoginDalayQueue.getLoginDalayQueue();
        }
        return queue.addEle(username);
    }

    private boolean removeEle(String username){
        People people = new People(username);
        if(delayQueue.contains(people)){
            return delayQueue.remove(people);
        }
        return false;
    }

    public static boolean removeElement(String username){
        LoginDalayQueue queue = null;
        if (loginDalayQueue == null) {
            queue = LoginDalayQueue.getLoginDalayQueue();
        }
        return queue.removeEle(username);
    }

    // 更新时间
    private synchronized boolean updateEle(String username){
        People people = new People(username);
        if (this.delayQueue.contains(people)) {
            this.delayQueue.remove(people);
            this.delayQueue.add(people);
            return true;
        }
        return false;
    }

    public static boolean updateEleTime(String username){
        LoginDalayQueue queue = null;
        if (loginDalayQueue == null) {
            queue = LoginDalayQueue.getLoginDalayQueue();
        }
        queue.updateEle(username);
        return true;
    }

    @Override
    public void run() {
        try {
            // 直接返回数据
            while (true){
                delayQueue.take();
            }
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            // 记录日志
        }
    }

    public static class People implements Delayed {
        private final long expireTime = 30 * 1000 * 60 + System.currentTimeMillis();
        private String username;

        public People(String username) {
            this.username = username;
        }

        @Override
        public long getDelay(TimeUnit unit) {
            //判断是否过期
            return unit.convert(expireTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
//            return unit.convert(expireTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
        }

        @Override
        public int compareTo(Delayed delayed) {
            //排序规则:按照过期时间排序
            People that = (People) delayed;
            if (this.expireTime < that.expireTime) {
                return -1;
            } else if (this.expireTime > that.expireTime) {
                return 1;
            } else {
                return 0;
            }
        }


        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            People people = (People) o;
            return username.equals(people.username);
        }

        @Override
        public int hashCode() {
            return Objects.hash(username);
        }

        public long getExpireTime() {
            return expireTime;
        }

        public String getUsername() {
            return username;
        }

        public void setUsername(String username) {
            this.username = username;
        }

    }

    public static void main(String[] args) {
        LoginDalayQueue loginDalayQueue1 = LoginDalayQueue.getLoginDalayQueue();
        loginDalayQueue1.start();
        loginDalayQueue1.addEle("123");
        loginDalayQueue1.addEle("321");
        loginDalayQueue1.addEle("123");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值