Java:Runnables和方法的执行。他们应该在哪里?这有关系吗?

时间:2012-02-14 10:14:11

标签: java multithreading class concurrency executorservice

如果我使用执行程序提交如下任务:

public SomeClass{  

     public void doSomething(){  

            Runnable r = new Runnable(){  
                 public void run(){  
                    callSomeMethod();  
                 }   

            }   

            executor.execute(r);  

    }  

}  

如果callSomeMethod

,它会有什么不同吗?
  • Runnable r
  • 的私有方法
  • 并发问题有关的SomeClass方法?

我没有提到变量的访问权限。

3 个答案:

答案 0 :(得分:2)

非常抽象地说(这就是你要求的),没有区别。方法只是一段代码。当一个线程执行一个方法时,该方法的副本存在于该线程的私有堆栈上,无论代码实际定义在何处。

访问共享变量和范围是一个完全不同的讨论。

答案 1 :(得分:2)

有微妙的差异,但对你来说无关紧要。

如果callSomeMethod()是私有的并且在封闭(外部)类中声明,则JVM规范将拒绝对其进行匿名Runnable访问(私有方法仅对声明类可见。内部类的概念对于VM是未知的)。 但是,根据语言规范,这是一个有效的调用。在这种情况下,java编译器会做一些魔术 - 它生成一个合成访问器(基本上是一个未在源中声明的方法,但纯粹由编译器生成,以启用对私有方法的访问)。

对于私人的班级成员也是如此。所以严格来说有一点不同,它会稍微扩大生成的类文件。

您应该选择最适合的代码可读性条款。 Runnable可以被视为方法的一部分(因此它包含类),因此如果callSomeMethod()对类声明类是私有的,则应该将其声明为private。

至于最好放置callSomeMethod()的位置,根据其目的是什么/它做什么(逻辑上期望找到代码执行的操作)做出决定。

答案 2 :(得分:0)

如果您不访问任何变量,您怎么会遇到并发问题?