Java:如何更新 Runnable lambda 中使用的变量?

标签 java lambda scheduledexecutorservice

我有以下代码。我在 scheduleNumbers() 方法中使用 ScheduledExecuterService 来显示指定毫秒数的一系列随机数。但是,我似乎无法更新在 setNumber lambda 中显示的 curNumber 作为“从 lambda 表达式引用的局部变量必须是最终的或有效的最终”(非常有用) )。有没有什么方法可以在不使用线程的情况下解决这个问题?完整代码位于下面的 Pastebin 链接中。

private void printNumbers(int[] randomNumbers) {
    int speed = DIFF_TIMES[difficulty.getSelectedIndex()];
    int amount = BASE_AMOUNT + currentScore;
    answerField.setEditable(false);
    scheduleNumbers(randomNumbers, speed, amount);
    currentNumberLab.setText("");
    answerField.setEditable(true);
}

public void scheduleNumbers(int[] randomNumbers, int speed, int amount) {
    int curNumber = 0;
    long initialDelay = 1000;
    final Runnable setNumber = () -> {
        currentNumberLab.setText(Integer.toString(randomNumbers[curNumber]));
        System.out.println("Set to " + randomNumbers[curNumber]);
    };
    final ScheduledFuture<?> setNumberHandle = scheduler.scheduleAtFixedRate(setNumber, initialDelay, speed, MILLISECONDS);
    scheduler.schedule(() -> {
        setNumberHandle.cancel(true);
    }, (speed*amount)+initialDelay, MILLISECONDS);
}

Full code .

为清楚起见进行编辑:

我希望能够递增 curNumber,以便每次运行 setNumber 时,都会将 currentNumberLab 设置为 Integer。 toString(randomNumbers[curNumber++]).

最佳答案

事实上,它提供了丰富的信息......

尝试以下操作:

public void scheduleNumbers(int[] randomNumbers, int speed, int amount) {
final int curNumber = 0;

它必须是最终的,因为一旦该方法完成,您将失去线程内局部变量的引用。该方法将完成,但线程可能仍在运行。声明局部变量fi​​nal可以帮助您解决这个问题。

如果您想在线程中更新 curNumber,请改用 AtomicInteger:

public void scheduleNumbers(int[] randomNumbers, int speed, int amount) {
final AtomicInteger curNumber = new AtomicInteger();
long initialDelay = 1000;
final Runnable setNumber = () -> {

    currentNumberLab.setText(Integer.toString(randomNumbers[curNumber.incrementAndGet()]));
    System.out.println("Set to " + randomNumbers[curNumber.get()]);
};

关于Java:如何更新 Runnable lambda 中使用的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26694140/

相关文章:

java - 通过使用 Lambda 函数匹配 map 列表和对象列表之间的字段来创建列表组合?

java - 迭代创建 lambda 表达式

java - 为我的多线程代码寻求改进建议。我需要12个不同的任务,6个池大小和15分钟的调度程序

multithreading - 如何在基于servlet的Web应用程序中运行后台任务?

java - 如何优雅地创建一个返回 lambda 的返回值或不返回任何内容的函数?

java - ScheduledFuture.cancel() 方法的同步

java - 恶意代码漏洞-字段应该被包保护

java - 使用 Docker 安装 rJava 包

Java 的比较器契约

java - 程序未终止