执行阶段 运行 持续 2 分钟,在此期间客户将在 2 - 6 秒之间随机到达并被放入队列

The execution phase run for 2 minutes during which time customers will arrive randomly between 2 - 6 seconds and be placed into a queue

我设法让顾客随机出现,我现在唯一的问题是将整个事情包装在一个 2 分钟的计时器中,而不会与顾客到达发生冲突。

static Timer timer = new Timer();

static class Task extends TimerTask {
    @Override
    public void run() {
        int delay = (new Random().nextInt(5)+2) * 1000;
        timer.schedule(new Task(), delay);
        System.out.println("Hi " + delay);
    }
}

public static void main(String args[]) {
    new Task().run();
}

这就是我目前使用的方法。我试过将它包装在另一个 TimerTask 中,并使用 System.nanoTime() 和一个 while 循环。他们最终都与客户的到来发生冲突。我通常喜欢自己解决问题,但我已经在这一部分上工作了几个小时,我还是想不通。

为什么不使用带有 do-while 循环的睡眠,例如:

long durationMillis = TimeUnit.MINUTES.toMillis(2);
long endTime = System.currentTimeMillis() + durationMillis;
do {
  int delaySec = ThreadLocalRandom.current().nextInt(2, 7);
  TimeUnit.SECONDS.sleep(delaySec);
  System.out.println("Hi " + delaySec);
} while (System.currentTimeMillis() < endTime);

如果您不需要等待整秒或 6 秒等待不包括在内,请更改 delaySec 语义。