当前位置: 首页 > 知识库问答 >
问题:

线程:在封闭作用域中定义的局部变量必须是final或实际上是final

钦海荣
2023-03-14

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

public void stopResolutionProcess() {
    stop = true;
}
boolean solutionFound = tournament.solve();
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
        }
    }
});

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

共有1个答案

濮阳旭东
2023-03-14

你的问题本身就有你所问的答案。

在封闭范围内定义的局部变量锦标赛必须是最终的或实际上是最终的

如果匿名类是在任何方法中创建的,那么所有在方法中定义但在匿名类主体之外的局部变量都应该是最终变量,以防需要在匿名类中使用它们。

public class OuterClass{
    int x,y;
    public void someMethod(){

         final int neededByAnonymousClass = x + y + 30;

         Runnable runnable = new Runnable(){
              // This is like we are creating a class which simply implements Runnable interface.
              // Scope of this class is inside the method someMethod()
              // run() method may be executed sometime later after the execution of someMethod() has completed.
             // all the local variables needs to be final in order they can be used later in time when run() gets executed.

             public void run(){
                 System.out.println(neededByAnonymousClass+ 40);
             }
         }
         Thread thread = new Thread(runnable); // passing the object of anonymous class, created above
         thread.start();
    }
}

[第1行:方法A,第2行方法A,第3行:匿名类,第4行匿名类的方法,第5行方法A]==>执行顺序

第1行,第2行,第3行(只是匿名类的对象创建),第5行。稍后,当调用匿名类创建的对象上的方法时,将执行第4行。

 类似资料: