该代码总结自电网敏感信息识别项目,特此分享
利用延时队列实现单账户登录
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");
}
}