使用DelayQueue模拟一个超时的小场景,进行编码!

本文介绍了一个使用Java和并发编程技术设计的驾校学员签到签退系统。通过DelayQueue实现学员按预设时间自动签退的功能,展示了如何在多线程环境下管理学员的签到状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.bfxy.thread.core.mycollection;

import java.util.concurrent.DelayQueue;

/**
 * 模拟一个驾校学员签到签退的场景
 */
public class Jiaxiao implements Runnable{
    private DelayQueue<Xueyuan> dq = new DelayQueue<Xueyuan>();
    public boolean start = true;   //表示驾校在上课的时候

    public  void qiandao(Integer id, String name, Long time){
        Xueyuan xueyuan = new Xueyuan(id,name,time);
        dq.add(xueyuan);
        System.out.println(xueyuan.getName()+" 签到");
    }
    public  void qiantui(Xueyuan xueyuan){
        System.out.println(xueyuan.getName()+" 时间已到,请签退");
    }

    @Override
    public void run() {
        while (start){
            try {
                Xueyuan xueyuan = dq.take();
                qiantui(xueyuan);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static  void  main(String[] args){
        Jiaxiao jiaxiao = new Jiaxiao();
        Thread t1 = new Thread(jiaxiao);
        t1.start();
        try {
            jiaxiao.qiandao(1,"周鹏",System.currentTimeMillis());
            Thread.sleep(2000);
            jiaxiao.qiandao(2,"朱正兴",System.currentTimeMillis());
            Thread.sleep(2000);
            jiaxiao.qiandao(3,"张新",System.currentTimeMillis());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

}

 

学员的实体类:

package com.bfxy.thread.core.mycollection;

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

public class Xueyuan implements Delayed{
    public Integer id;
    public String name;
    public Long qiandaotime;

    public Xueyuan(Integer id, String name,Long qiandaotime) {
        this.id = id;
        this.name = name;
        this.qiandaotime = qiandaotime;
    }

    private final TimeUnit timeUnit = TimeUnit.SECONDS;

    private final int shangketime = 10000;//10s  延迟时间

    @Override
    public long getDelay(TimeUnit unit) {//需要实现的接口,获得延迟时间   用过期时间-当前时间
        return (qiandaotime+shangketime)- System.currentTimeMillis();
    }

    @Override
    public int compareTo(Delayed o) {//用于延迟队列内部比较排序   当前对象的延迟时间 - 比较对象的延迟时间
        Xueyuan xueyuan = (Xueyuan) o;
        return this.getDelay(timeUnit) - o.getDelay(timeUnit) > 0 ? 1 : -1;
    }


    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Long getQiandaotime() {
        return qiandaotime;
    }

    public void setQiandaotime(Long qiandaotime) {
        this.qiandaotime = qiandaotime;
    }
}

执行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值