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

标签 java multithreading class concurrency executorservice

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

public SomeClass{  

     public void doSomething(){  

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

            }   

            executor.execute(r);  

    }  

}  

如果 callSomeMethod

有什么不同吗
  • Runnable r
  • 的私有(private)方法
  • SomeClass 的方法以任何方式与并发 问题相关?

我不是指访问变量。

最佳答案

有细微差别,但对您来说应该无关紧要。

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

私有(private)的类成员也是如此。所以严格来说是有区别的,它会稍微放大生成的类文件。

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

至于将 callSomeMethod() 放在哪里最好,请根据它的目的是什么/它做了什么(您在逻辑上期望在哪里找到代码执行的操作)来做出决定。

关于Java:Runnable 和方法的执行。他们应该在哪里?这有关系吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9275111/

相关文章:

java - DynamoDB 读取吞吐量低于容量且没有任何限制

java - JAXB:将单独的日期和时间元素映射到一个属性

java - 添加图标和分隔符到 Windows XP 右键单击​​上下文菜单

c++ - 当条件产生时结束线程。 C/C++

java - 关于两个线程的同步

c++ - C++ 中 PRNG 的默认随机引擎为类的每个实例生成相同的输出 - 正确的种子?

事件的 C# 实现

java - 你可以使 id 动态 - <div id=[此处动态字段]

Java:线程缓存

c++ - 将对类的引用声明为类成员