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

Java:可运行和方法的执行。他们应该在哪里?有关系吗?,java,multithreading,class,concurrency,executorservice,Java,Multithreading,Class,Concurrency,Executorservice,如果我使用执行人提交以下任务: public SomeClass{ public void doSomething(){ Runnable r = new Runnable(){ public void run(){ callSomeMethod(); } } exec

如果我使用执行人提交以下任务:

public SomeClass{  

     public void doSomething(){  

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

            }   

            executor.execute(r);  

    }  

}  
如果
callsomethod

  • Runnable r
    的私有方法,或
  • 与并发问题相关的
    SomeClass
    方法

我不是指变量的访问

如果你不访问任何变量,怎么会有并发问题?

如果你不访问任何变量,怎么会有并发问题?

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


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

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


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

存在细微的差异,但这对您来说并不重要

如果callSomeMethod()是私有的并在封闭(外部)类中声明,JVM规范将拒绝匿名可运行访问它(私有方法仅对声明类可见。内部类的概念对VM是未知的)。 但是,根据语言规范,这是一个有效的调用。java编译器在这种情况下发挥了一些神奇的作用——它生成了一个合成的访问器(基本上是一个没有在源代码中声明的方法,但纯粹由编译器生成,以允许访问私有方法)

对于私有的类成员也是如此。严格地说,这是有区别的,它会将生成的类文件放大一点点

就代码可读性而言,您应该选择最合适的形式。Runnable可以被视为方法的一部分(以及它的包含类),因此如果callSomeMethod()对于声明类的类是私有的,那么它应该被声明为私有的


至于将callSomeMethod()放在哪里最好,请根据它的用途/作用(逻辑上,您希望在哪里找到代码执行的操作)做出决定。

有细微的区别,但这对您来说并不重要

如果callSomeMethod()是私有的并在封闭(外部)类中声明,JVM规范将拒绝匿名可运行访问它(私有方法仅对声明类可见。内部类的概念对VM是未知的)。 但是,根据语言规范,这是一个有效的调用。java编译器在这种情况下发挥了一些神奇的作用——它生成了一个合成的访问器(基本上是一个没有在源代码中声明的方法,但纯粹由编译器生成,以允许访问私有方法)

对于私有的类成员也是如此。严格地说,这是有区别的,它会将生成的类文件放大一点点

就代码可读性而言,您应该选择最合适的形式。Runnable可以被视为方法的一部分(以及它的包含类),因此如果callSomeMethod()对于声明类的类是私有的,那么它应该被声明为私有的


至于将callSomeMethod()放在何处的最佳位置,请根据其用途/功能(逻辑上,您希望找到代码执行的操作)做出决定.

我想访问变量。我想知道是否有与共享变量无关的问题我想访问变量。我想知道是否有与共享变量无关的问题+1:“性能”部分/由于编译器自动修改而产生的大小是我感兴趣的一点。如果您还有一些关于可读性的具体示例/建议,那么对于可读性部分也会非常感激;我认为没有一个既定的最佳实践来放置可运行的声明。我唯一想到的是一个更一般的问题,即在何处放置匿名内部类(以及何时使用它们)。也许你应该单独问这个问题;一个好的标题肯定会得到比我希望得到的更好的回答。+1:编译器自动修改导致的“性能”/“大小”部分是我感兴趣的一点。如果您还有一些关于可读性的具体示例/建议,那么对于可读性部分也会非常赞赏;我认为没有一个既定的最佳实践来放置可运行的声明。我唯一想到的是一个更一般的问题,即在何处放置匿名内部类(以及何时使用它们)。也许你应该单独问这个问题;一个好的标题肯定会得到比我希望的更好的回应。