代码之家  ›  专栏  ›  技术社区  ›  Fiery Phoenix

使用Java的Timer在循环迭代之间等待一段时间

  •  0
  • Fiery Phoenix  · 技术社区  · 3 年前

    学习使用Java定时器。

    如果我想在循环中打印迭代器的内容,并在每次打印之间等待5秒,我可以使用 Thread.sleep .但是我试着在没有 威胁睡眠 。这是我迄今为止的尝试:

            do {
                Timer printTimer = new Timer();
                printTimer.schedule(
                    new TimerTask() {
                      @Override
                      public void run() {  
                        print(myIterator.next().toString()); // using System.out.println internally
                     }
                    }, 5000);
            } while (myIterator.hasNext())
    

    然而,以上基本上导致了一个无限循环。它不会像我一样每次迭代执行一次任务并等待5秒 威胁睡眠 。换句话说,它似乎没有检查 myIterator.hasNext() 条件

    有没有办法让它模拟对 Thread.sleep(5000) 打印后?

    1 回复  |  直到 3 年前
        1
  •  2
  •   blacktide Gaurav    3 年前

    它之所以看起来是无限循环的,是因为 myIterator.next() 直到 TimerTask 被执行,因此 myIterator.hasNext() 不是在每次循环迭代中更新。尝试移动 myIterator.next() 在外部调用 定时器任务 以及环路内部。

    您还可以维护每次迭代的计数,以5秒为增量安排每个任务,以及重用 Timer 例子

    我还建议使用 while 循环而不是 do-while 循环,除非您确信迭代器将始终至少有一个元素,否则您可能会得到 NoSuchElementException

    以下是一个工作示例:

    List<String> list = Arrays.asList("a", "b", "c");
    Iterator<String> iterator = list.iterator();
    int i = 0;
    Timer timer = new Timer();
    while(iterator.hasNext()) {
        String value = iterator.next();
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                System.out.println(value);
            }
        };
        timer.schedule(task, 5000L * i++);
    }
    

    它输出以下内容:

    a // after 0 seconds
    b // after 5 seconds
    c // after 10 seconds