ScheduleAtFixedRate 方法上的 IllegalArgumentException

tch*_*son 2 java

Runnable runPickWinner = new Runnable() {
        @Override
        public void run() {
            mPot.pickWinner();
        }
    };
ScheduledExecutorService execPickWinner = Executors.newScheduledThreadPool(1);
execPickWinner.scheduleAtFixedRate(runPickWinner, runPickWinnerTime.longValue(), runPickWinnerTime.longValue(), TimeUnit.MINUTES);
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

java.lang.IllegalArgumentException
    at java.util.concurrent.ScheduledThreadPoolExecutor.scheduleAtFixedRate(Unknown Source) ~[?:1.8.0_131]
    at com.tchristofferson.Lottery.runLottery(Lottery.java:223) ~[?:?]
    at com.tchristofferson.Lottery.onEnable(Lottery.java:50) ~[?:?]
    at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:271) ~[craftbukkit.jar:git-Bukkit-c19c293]
    at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:329) [craftbukkit.jar:git-Bukkit-c19c293]
    at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:404) [craftbukkit.jar:git-Bukkit-c19c293]
    at org.bukkit.craftbukkit.v1_11_R1.CraftServer.enablePlugin(CraftServer.java:361) [craftbukkit.jar:git-Bukkit-c19c293]
    at org.bukkit.craftbukkit.v1_11_R1.CraftServer.enablePlugins(CraftServer.java:323) [craftbukkit.jar:git-Bukkit-c19c293]
    at net.minecraft.server.v1_11_R1.MinecraftServer.t(MinecraftServer.java:411) [craftbukkit.jar:git-Bukkit-c19c293]
    at net.minecraft.server.v1_11_R1.MinecraftServer.l(MinecraftServer.java:372) [craftbukkit.jar:git-Bukkit-c19c293]
    at net.minecraft.server.v1_11_R1.MinecraftServer.a(MinecraftServer.java:327) [craftbukkit.jar:git-Bukkit-c19c293]
    at net.minecraft.server.v1_11_R1.DedicatedServer.init(DedicatedServer.java:244) [craftbukkit.jar:git-Bukkit-c19c293]
    at net.minecraft.server.v1_11_R1.MinecraftServer.run(MinecraftServer.java:521) [craftbukkit.jar:git-Bukkit-c19c293]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_131]
Run Code Online (Sandbox Code Playgroud)

这似乎是 上的一个错误scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit),但没有意义它们是 Integer 类型,但随后我调用longValue()它应该将它们变成 long 类型。我只是通过在其中硬编码一个值来使其工作,例如如果我使用 10L 或仅 10 它可以工作,但这是不行的。

hag*_*wal 6

查看您正在使用的方法的 Java 实现,即ScheduledThreadPoolExecutor.scheduleAtFixedRate

public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,
                                                  long initialDelay,
                                                  long period,
                                                  TimeUnit unit) {
        if (command == null || unit == null)
            throw new NullPointerException();
        if (period <= 0)
            throw new IllegalArgumentException();
        RunnableScheduledFuture<?> t = decorateTask(command,
            new ScheduledFutureTask<Object>(command,
                                            null,
                                            triggerTime(initialDelay, unit),
                                            unit.toNanos(period)));
        delayedExecute(t);
        return t;
    }
Run Code Online (Sandbox Code Playgroud)

IllegalArgumentException当 时抛出异常period <= 0,因此基本上您传递的runPickWinnerTime.longValue()值小于 0,即该方法的第三个参数小于 0,而实际上不应该小于 0。

当您进行硬编码时,您会硬编码正确的值,但是当您使用时,情况runPickWinnerTime.longValue()并非如此,因此您需要创建runPickWinnerTime大于 0 的值,并且您应该为您的initialDelay和使用不同的对象period,我看到您正在使用相同的对象,这导致你意想不到的问题。