【问题标题】:Iterate through list using scheduleAtFixedRate in Java在 Java 中使用 scheduleAtFixedRate 遍历列表
【发布时间】:2019-12-22 05:49:09
【问题描述】:

我正在尝试根据用户可以设置的计时器来遍历列表。但是我在 TimerTask 可运行文件中找不到一个好方法。

可以在我在下面分享的代码中找到总体思路。 AnnouncementsListList<String>。在每个间隔上,我都想从announcements 中获取下一个announcement 并显示其中的字符串。除了计时器超过多个announcements,我已经完成了所有工作:

 timer.scheduleAtFixedRate(new TimerTask() {
        int iterator = 0;
        @Override
        public void run() {

            List<String> announcement = announcements.get(iterator);

            for (String line : announcement) {
                Bukkit.broadcastMessage(line);
            }

            iterator++;
            if(iterator > announcements.size()){
                iterator = 0;
            }
        }
    }, 0, (int)config.get("interval")*1000);

使用我发布的代码,我得到一个IndexOutOfBoundsException,它甚至从未发布任何消息。如果我删除迭代器代码,它将无休止地显示第一个 announcement

【问题讨论】:

  • 你能描述一下你当前的实现到底出了什么问题吗?期望的行为是什么,当前的行为与此有何不同?您所说的“......除了计时器会检查多个公告”是什么意思?
  • 对不起,如果我的问题有点不清楚,这是我第一次发帖,我真的不知道如何表达这些问题。幸运的是,其他人通过代码示例帮助了我。感谢您的评论 :)
  • 这里需要注意的是,Timer 并不能很好地处理异常。尝试使用“ScheduledThreadPoolExecutor”更好地处理异常。

标签: java multithreading loops iterator runnable


【解决方案1】:

你有错误的以下条件:

if(iterator > announcements.size())

在这种情况下,超出了列表的大小,因此抛出了IndexOutOfBoundsException。但应检查的条件是iterator 大于或等于 到列表的大小:

if(iterator >= announcements.size())

【讨论】:

    猜你喜欢
    • 2016-10-09
    • 2011-02-16
    • 2011-02-08
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 2020-01-14
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多