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

时间:2014-02-03 19:07:15

标签: java class runnable

美好的一天,

我有一个名为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}
}

问题是,我的Runnable对象似乎无法访问globalVar!似乎是它自己的对象以某种方式无法引用其内部的内容。不管怎么说呢?

问题在于此代码本身不起作用。 Runnable无法访问globaVar。我需要将aWorkerTask包装在Runnable中,并且需要访问globalVar

3 个答案:

答案 0 :(得分:1)

我不确定这是否是最佳实现,但我所做的是创建一个实现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)
        }
}

并传入主对象functionHandler,其中包含我需要作为Runnable创建的函数。 然后我创建一个runnable:

MyRunnable taskProcessor = new MyRunnable(this,variableName,functionValues,jobNum.toString());
threadPool.runTask(taskProcessor);

答案 1 :(得分:0)

Runnable对象确实是它自己的对象。您可以选择通过mutator设置它或将globalVar声明为final。这是mutator解决方案,如果你不想让globalVar成为final:

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可以在线程内部和外部进行修改,则需要将其包装在合适的解除引用对象中。

答案 2 :(得分:0)

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

 static Object globalVar;