我有以下代码。我在 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);
}
为清楚起见进行编辑:
我希望能够递增 curNumber
,以便每次运行 setNumber
时,都会将 currentNumberLab
设置为 Integer。 toString(randomNumbers[curNumber++])
.
最佳答案
事实上,它提供了丰富的信息......
尝试以下操作:
public void scheduleNumbers(int[] randomNumbers, int speed, int amount) {
final int curNumber = 0;
它必须是最终的,因为一旦该方法完成,您将失去线程内局部变量的引用。该方法将完成,但线程可能仍在运行。声明局部变量final可以帮助您解决这个问题。
如果您想在线程中更新 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/