2012-02-14 4 views
1

次のように私は仕事を提出するexecutorを使用する場合:callSomeMethodJava:実行可能ファイルとメソッドの実行。彼らはどこにあるべきですか?それは重要ですか?

  • Runnable rまたは
  • いずれかにSomeClass方法のプライベートな方法であれば

    public SomeClass{ 
    
        public void doSomething(){ 
    
          Runnable r = new Runnable(){ 
           public void run(){ 
            callSomeMethod(); 
           } 
    
          } 
    
          executor.execute(r); 
    
        } 
    
    } 
    

    それはどんな違いを生むん方法は並行性問題に関連する?

私は変数のアクセスを参照していません。

答えて

2

微妙な違いがありますが、それはあなたにとって重要ではありません。

callSomeMethod()がprivateであり、囲む(外側)クラスで宣言されている場合、JVM仕様では匿名のRunnableへのアクセスが拒否されます(プライベートメソッドは宣言するクラスでのみ表示されます)。 VM)。 しかし、言語仕様では、これは有効な呼び出しです。この場合、Javaコンパイラは合成アクセッサを生成します(基本的には、ソースで宣言されていないメソッドですが、コンパイラによって純粋に生成され、プライベートメソッドへのアクセスを可能にします)。

プライベートなクラスメンバでも同じことが起こります。厳密に言えば違いがありますが、結果として得られるクラスファイルはごくわずかに拡大されます。

コードの可読性という点で最も適切な形式を選択する必要があります。 Runnableはメソッドの一部(したがってそのクラスを含む)として見ることができるので、callSomeMethod()がクラスを宣言するクラスに対してプライベートである場合、privateと宣言する必要があります。

callSomeMethod()をどこに置くのが最適かは、その目的が何であるか(コードによって実行される操作を論理的に期待する場所)に基づいて決定することです。

+0

+1:コンパイラの自動修正による「パフォーマンス」/サイズの部分は、興味があった点です。あなたはまた、いくつかの具体的な例を持っています/可読性についての提案も高く評価されます – Jim

+0

可読性の部分については、私は、Runnable宣言をどこに置くべきか、確立されたベストプラクティスがあるとは思わない。匿名の内部クラスをどこに配置するか(およびそれらをいつでも使用する)というより一般的な問題が唯一のことです。たぶんあなたはこれを別の質問として尋ねるべきでしょう。良いタイトルは確かに私が与えることを望むよりも良い反応を得るでしょう。 – Durandal

0

どのような変数にもアクセスしない場合、の同時実行性はになる可能性がありますか?

+0

私は変数へのアクセスが必要です。共有変数と無関係な問題があるかどうか疑問に思っていました。 – Jim

2

非常に抽象的な(これはあなたが尋ねたものです)と言えば、違いはありません。メソッドは単なるコードです。スレッドがメソッドを実行すると、実際にコードが定義された場所に関係なく、そのメソッドのコピーがスレッドのプライベートスタックに存在します。

共有変数とスコープへのアクセスは、全く異なる議論です。

関連する問題