如果我使用执行程序提交如下任务:
public SomeClass{
public void doSomething(){
Runnable r = new Runnable(){
public void run(){
callSomeMethod();
}
}
executor.execute(r);
}
}
如果callSomeMethod
Runnable r
或SomeClass
方法? 我没有提到变量的访问权限。
答案 0 :(得分:2)
非常抽象地说(这就是你要求的),没有区别。方法只是一段代码。当一个线程执行一个方法时,该方法的副本存在于该线程的私有堆栈上,无论代码实际定义在何处。
访问共享变量和范围是一个完全不同的讨论。
答案 1 :(得分:2)
有微妙的差异,但对你来说无关紧要。
如果callSomeMethod()是私有的并且在封闭(外部)类中声明,则JVM规范将拒绝对其进行匿名Runnable访问(私有方法仅对声明类可见。内部类的概念对于VM是未知的)。 但是,根据语言规范,这是一个有效的调用。在这种情况下,java编译器会做一些魔术 - 它生成一个合成访问器(基本上是一个未在源中声明的方法,但纯粹由编译器生成,以启用对私有方法的访问)。
对于私人的班级成员也是如此。所以严格来说有一点不同,它会稍微扩大生成的类文件。
您应该选择最适合的代码可读性条款。 Runnable可以被视为方法的一部分(因此它包含类),因此如果callSomeMethod()对类声明类是私有的,则应该将其声明为private。
至于最好放置callSomeMethod()的位置,根据其目的是什么/它做什么(逻辑上期望找到代码执行的操作)做出决定。
答案 2 :(得分:0)
如果您不访问任何变量,您怎么会遇到并发问题?