当我在写这段代码时,我得到了一个编译时错误,它说:“lambdas中的变量必须是final或实际上是final”。
public class test {
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService executorService = Executors.newFixedThreadPool(10);
List<Future<String>> futureLists = new ArrayList<>();
for (int i = 0; i < 20; i++) {
futureLists.add(executorService.submit( () -> "Hello world" + i));
}
for (Future<String> itr:futureLists) {
System.out.println(itr.get());
}
}
}
它与多线程编程有关。
到目前为止,Java中的局部变量不受争用条件和可见性问题的影响,因为它们只能被执行声明它们的方法的线程访问。但是lambda可以从创建它的线程传递到另一个线程,因此,如果第二个线程计算的lambda被赋予变异局部变量的能力,这种免疫力就会丧失。-来源
这个问题在这里已经有了答案: > 为什么匿名类只能访问最终变量? 为什么对于实例变量[重复]忽略“Lambda表达式中使用的变量必须是final或实际上是final”警告 “lambda在start方法参数被垃圾回收后才能运行”是什么意思? 为什么要复制?
我正在研究Java8流,我理解lambdas的唯一问题是为什么lambdas中有效的最后警告被忽略,例如实例(和静态)变量。我似乎在网上找不到任何关于它的参考,因为大多数页面只会谈论“有效最终”的定义。
这个问题以前在这里问过 我关于为什么在这里回答的问题 但我对这个答案有一些怀疑。提供的答案提到- 为了降低bug的风险,他们决定确保捕获的变量永远不会变异。我对它会导致并发问题的说法感到困惑。 我在Baeldung上读了一篇关于并发问题的文章,但我仍然对它如何导致并发问题感到有点困惑,有人能用一个例子来帮助我吗?提前谢了。
我正在尝试创建一个I*J数量的按钮。 提前多谢。
我的主类在方法中运行。它运行一个可能需要大量时间才能完成的进程,所以我创建了另一个方法来停止该进程:它只是引发一个标志,使整个进程停止: 为了测试停止进程的方法,我应该采取什么方法来解决这个问题?