gpt4 book ai didi

java - 线程 : Local variable defined in an enclosing scope must be final or effectively final

转载 作者:行者123 更新时间:2023-11-29 06:54:49 25 4
gpt4 key购买 nike

我的主类在 main 方法中运行。它运行一个可能需要大量时间才能完成的进程,因此我创建了另一种方法来停止该进程:它只是引发一个标志,使整个进程停止:

public void stopResolutionProcess() {
stop = true;
}

这是执行大进程的调用:

boolean solutionFound = tournament.solve();

所以就在它之前,我需要运行一个辅助线程来调用 stopResolutionProcess():

Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Stop resolution process? (Y/N): ");
String answer = sc.next();
if (answer.equalsIgnoreCase("y")) {
tournament.getSolver().stopResolutionProcess(); // error here
}
}
});

但是我在最后一行遇到错误。它说:

Local variable tournament defined in an enclosing scope must be final or effectively final

为了测试停止进程的方法,我应该采取什么方法来解决这个问题?

最佳答案

那么问题是什么..一个小例子

String myString = new String("MyString");
Thread thr = new Thread() {
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(myString);
}
}
}
thr.start();
myString = new String("AnotherString");

那么你期望这里的输出是什么?像这样的东西:

MyString
MyString
AnotherString
AnotherString
AnotherString

问题是您不知道 myString 变量何时更改。这可能发生在打印 0 次之后、打印 5 次之后或两者之间的任何时间。或者换句话说,这是不可预测的,也不太可能是故意的。
为了具有定义的行为,您在线程中使用的变量需要是最终的:

final String myString = new String("MyString");
Thread thr = new Thread() {
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(myString);
}
}
}
thr.start();
// now this following line is not valid anymore and will lead to a compile error
myString = new String("AnotherString");

现在我们有了定义的行为,我们知道输出将是:

MyString
MyString
MyString
MyString
MyString

关于java - 线程 : Local variable defined in an enclosing scope must be final or effectively final,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36530790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com