Java: Runnables и выполнение методов. Где они должны быть? Имеет ли это значение? - PullRequest
1 голос
/ 14 февраля 2012

Если я использую исполнителя для отправки задач следующим образом:

public SomeClass{  

     public void doSomething(){  

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

            }   

            executor.execute(r);  

    }  

}  

Имеет ли значение, если callSomeMethod равно

  • частный метод Runnable r или
  • метод SomeClass, каким-либо образом связанный с проблемами параллелизма ?

Я не ссылаюсь на доступ к переменным.

Ответы [ 3 ]

2 голосов
/ 14 февраля 2012

Очень очень абстрактно (это то, что вы просили), нет никакой разницы.Метод - это просто кусок кода.Когда поток выполняет метод, копия этого метода существует в частном стеке потока, независимо от того, где код был фактически определен.

Доступ к общим переменным и область видимости - это совершенно другое обсуждение.

2 голосов
/ 14 февраля 2012

Есть небольшие различия, но это не должно иметь для вас значения.

Если callSomeMethod () является закрытым и объявлен во включающем (внешнем) классе, спецификация JVM будет запрещать анонимный доступ Runnable к нему (Privateметоды видны только декларирующему классу (концепция внутренних классов неизвестна виртуальной машине).Однако, согласно спецификации языка, это допустимый вызов.В этом случае java-компилятор делает немного магии - он генерирует синтетический метод доступа (в основном метод, не объявленный в исходном коде, но сгенерированный компилятором для обеспечения доступа к приватному методу).

То же самое происходитдля учеников, которые являются частными.Так что, строго говоря, есть разница, это приведет к небольшому увеличению результирующих файлов классов.

Вы должны выбрать любую форму, наиболее подходящую ей с точки зрения читабельности кода.Runnable можно рассматривать как часть метода (и, следовательно, его содержащий класс), поэтому, если callSomeMethod () является закрытым для класса, объявляющего класс, он должен быть объявлен как private.

Относительно того, куда лучше поместить callSomeMethod(), примите это решение, основываясь на том, каково его назначение / что он делает (где вы логически ожидаете найти операцию, выполняемую кодом).

0 голосов
/ 14 февраля 2012

Если у вас нет доступа к каким-либо переменным, как у вас могут возникнуть параллелизм проблемы?

...