DelayQueue延迟队列用法

1. 创建Delayed实现类

public class CancelDelay implements Delayed {
    //用户id
    private Integer userId;
    //过期时间
    private Date time;
    //用户状态
    private Integer status;

    public CancelDelay() {

    }

    public CancelDelay(Integer userId, Date time, Integer status) {
        this.userId = userId;
        this.time = time;
        this.status = status;
    }

    // 设置延时时间
    public long getDelay(TimeUnit unit) {
        long l = unit.convert(time.getTime() - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
        return l;
    }

    public int compareTo(Delayed o) {
        //根据取消时间来比较,如果取消时间小的,就会优先被队列提取出来
        return time.compareTo(((CancelDelay) o).getTime());

    }

    public Date getTime() {
        return time;
    }

    public void setTime(Date time) {
        this.time = time;
    }

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }
}

2.把实现类交给ioc方便存取队列

@Component
public class CancelQueue {
    public DelayQueue queue = new DelayQueue();
}

3.测试 根据用户姓名取出用户 一分钟后修改用户状态

    @Autowired
    private IUserService userServiceImpl;
    @Autowired
    private CancelQueue cancelQueue;

 
@GetMapping("getUserByName")
    public User getUserByName(@RequestParam String username) {
        User user = userServiceImpl.findByUsername(username);
        cancelQueue.queue.add(new CancelDelay(user.getId(), new Date(System.currentTimeMillis() + 60 * 1000L), 1));
        new Thread(() -> {
            while (true) {
                try {
                    CancelDelay cancelDelay = cancelQueue.queue.take();
                    User user1 = new User();
                    user1.setId(cancelDelay.getUserId());
                    user1.setStatus(cancelDelay.getStatus());
                    userServiceImpl.updateById(user1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
        return user;
    }

你可能感兴趣的:(java,开发语言)