You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在2分钟定时器内实现无冲突的随机客户到达逻辑?

解决2分钟内客户随机到达的调度问题

嘿,你这个需求很明确——要让客户在2分钟窗口内随机2-6秒到达,时间到了就自动停止所有调度对吧?我看你现在的代码是无限循环调度任务,没设停止机制,咱们来调整一下,完美兼容你现有的客户到达逻辑:

方案一:用结束时间标记控制(直观易懂)

import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

public class CustomerScheduler {
    static Timer timer = new Timer();
    // 提前计算2分钟后的结束时间戳
    static long endTime;

    static class CustomerArrivalTask extends TimerTask {
        @Override
        public void run() {
            // 先检查是否已到结束时间,到点就停掉整个定时器
            if (System.currentTimeMillis() >= endTime) {
                timer.cancel();
                System.out.println("2分钟执行周期结束,停止客户到达调度");
                return;
            }

            // 这里替换成你实际的客户入队逻辑
            System.out.println("新客户进入队列!");

            // 生成下一次客户到达的随机延迟(2-6秒)
            int nextDelay = (new Random().nextInt(5) + 2) * 1000;
            // 调度下一个客户到达任务
            timer.schedule(new CustomerArrivalTask(), nextDelay);
        }
    }

    public static void main(String args[]) {
        // 设置结束时间:当前时间 + 2分钟(120000毫秒)
        endTime = System.currentTimeMillis() + 120 * 1000;
        // 启动第一个客户到达任务
        new CustomerArrivalTask().run();
    }
}

关键逻辑说明

  • 停止判断前置:每次执行客户到达逻辑前,先检查是否超过2分钟窗口,避免在结束后还生成新客户,完全不会和现有随机到达逻辑冲突。
  • 全局时间标记:用endTime提前锁定结束点,不用额外定时器,逻辑直接清晰。

方案二:独立停止任务(更优雅解耦)

如果你不想用全局变量,也可以把「客户到达」和「定时停止」拆成两个独立任务,逻辑更清爽:

import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

public class CustomerScheduler {
    static Timer timer = new Timer();

    static class CustomerArrivalTask extends TimerTask {
        @Override
        public void run() {
            // 你的客户入队逻辑
            System.out.println("新客户进入队列!");
            
            // 调度下一次随机到达
            int nextDelay = (new Random().nextInt(5) + 2) * 1000;
            timer.schedule(new CustomerArrivalTask(), nextDelay);
        }
    }

    public static void main(String args[]) {
        // 立即启动第一个客户到达任务
        timer.schedule(new CustomerArrivalTask(), 0);

        // 单独设置一个2分钟后的停止任务
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                timer.cancel();
                System.out.println("2分钟执行周期结束,停止所有调度");
            }
        }, 120 * 1000); // 2分钟后触发停止
    }
}

这种方式把两个核心逻辑完全解耦,不用维护全局变量,代码可读性更高,推荐你试试~

内容的提问来源于stack exchange,提问作者Angelica Amis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:34:54