美好的一天,
我有一个名为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
答案 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;