Java 无法通过类中的Runnable访问全局变量

Java 无法通过类中的Runnable访问全局变量,java,class,runnable,Java,Class,Runnable,你好 我有一个名为FunctionHandler的类,它包含一个名为evaluate的方法,如下所示: class FunctionHandler{ Object globalVar; public void Evaluate(){ ThreadPool pool; Runnable task = new Runnable(){ public void run() { aWorkerTask(globalVar); } }

你好

我有一个名为FunctionHandler的类,它包含一个名为evaluate的方法,如下所示:

class FunctionHandler{
 Object globalVar;

 public void Evaluate(){
      ThreadPool pool;

      Runnable task = new Runnable(){
          public void run() {  aWorkerTask(globalVar); }
      }


      pool.start(task);
      pool.stop();
 }

 public void aWorkerTask(Object object){//worker stuff}
}
问题是,我的可运行对象似乎无法访问globalVar!似乎是它自己的对象无法引用它的类中的内容。它周围有什么东西吗


问题是这段代码本来就不起作用。Runnable无法访问GlobalVar。我需要一个WorkerTask被包装在一个Runnable中,它需要访问globalVar

一个Runnable对象实际上是它自己的对象。您可以选择通过一个mutator设置它,或者将globalVar声明为final。如果您不想让globalVar成为最终版本,这里有一个变种解决方案:

public void startRun() {
    Object globalVar = new Object();
    Runnable run = new Runnable() {
        Object localVar;
        public Runnable prepare(Object param) {
            localVar = param;
            return this;
        }
        @Override
        public void run() {
            /* Do your stuff */
        }
    }.prepare(globalVar);
}

请注意,如果执行此操作并且希望globalVar在线程内部和外部都可修改,则需要将其包装在适当的解引用对象中。

我不确定这是否是最佳实现,但我所做的是创建一个实现Runnable的类:

public class MyRunnable implements Runnable {
        private FunctionHandler functionHandler; //Global Reference - Only reading from it
            private Object globalVar;

        public MyRunnable(FunctionsHandler functionsHandler,Object globalVar) {
            this.functionsHandler = functionsHandler;
            this.globalVar = globalVar;
        }

        public void run(){
              functionHandler.aWorkerTask(globalVar)
        }
}
MyRunnable taskProcessor = new MyRunnable(this,variableName,functionValues,jobNum.toString());
threadPool.runTask(taskProcessor);
并传入主对象functionHandler,其中包含我需要作为可运行函数生成的函数。 然后,我创建一个可运行的:

public class MyRunnable implements Runnable {
        private FunctionHandler functionHandler; //Global Reference - Only reading from it
            private Object globalVar;

        public MyRunnable(FunctionsHandler functionsHandler,Object globalVar) {
            this.functionsHandler = functionsHandler;
            this.globalVar = globalVar;
        }

        public void run(){
              functionHandler.aWorkerTask(globalVar)
        }
}
MyRunnable taskProcessor = new MyRunnable(this,variableName,functionValues,jobNum.toString());
threadPool.runTask(taskProcessor);

如果您希望可运行程序能够访问类变量,那么它们必须是静态的;只需将代码更改为:

 static Object globalVar;

您需要一些分号。这是一个更一般的示例,用于显示结构您得到的确切错误消息是什么?您正在运行的确切代码是什么?这个例子对我们一点帮助都没有,问题是这个代码本来就不起作用。Runnable无法访问GlobalVar。我需要一个WorkerTask被包装在一个Runnable中,它需要访问GlobalVarther。在编辑之后,OP中的代码仍然存在语法错误。您可以发布实际代码(精简)和/或实际错误消息吗?匿名/本地类访问字段不需要是最终字段。我怀疑OP的实际代码有一些根本不同的地方,比如
globalVar
实际上是一个局部变量,或者它是一个实例变量,
Evaluate
是一个静态方法。成员变量没有,但局部变量有。如果OP无法访问globalVar,最可能的原因是因为他使用了一个局部变量。此时,您可能希望创建一个新类,因为您的匿名内部类有点长。是的。匿名类总是太长的IMO,他们只是在其他流体代码的中间添加垃圾样板;OP的解决方案是编写自己的类,这是一种很好的方法。有时,特别是对于临时或“调试”代码,这种方法很方便,很多人都不这么认为。