如何在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
相关产品推荐
相关产品推荐

