Как можно не ждать выполнения блока кода или метода? - PullRequest
5 голосов
/ 19 октября 2010

Каковы правильные способы / практики / реализации / стратегии (или как мы это называем) для , чтобы не ждать завершения блока / метода кода для выполнения в Java?

Предположим следующий метод:

private void myMethod()
{
     // Some lines of code here
     .....
     .....
     .....

     anotherMethod(); // or this could be a code block

     // Again some lines of code here
     .....
     .....
     .....
}

В этом случае я ожидаю, что myMethod() не должен ждать завершения кода для выполнения anotherMethod(). Здесь я также могу заверить, что последующие строки кода не зависят от выполнения чего-либо в anotherMethod().

Ответы [ 3 ]

7 голосов
/ 19 октября 2010

Использовать

Executor executor = Executors.newSingleThreadExecutor();
executor.execute(new Runnable() {
    @Override
    public void run() {
       anotherMethod();
    }
});
// this is called automatically when the object is gc-ed, 
// but you should not rely on this, hence the explicit call
executor.shutdown();

Цитировать Effective Java:

Вы не только должны воздерживаться от написания собственных рабочих очередей, но и вообще не должны работать напрямую с потоками.Ключевой абстракцией больше не является Thread, который служил как единицей работы, так и механизмом ее выполнения.Теперь единица работы и механизм разделены.Ключевая абстракция - это единица работы, которая называется задачей.Существует два вида задач: Runnable и его близкий родственник Callable (который похож на Runnable, за исключением того, что он возвращает значение).Основным механизмом выполнения задач является служба исполнителя.Если вы думаете с точки зрения задач и позволяете службе-исполнителю выполнять их за вас, вы получаете большую гибкость в плане выбора соответствующих политик выполнения.По сути, Executor Framework делает для выполнения то же самое, что и Collections Framework для агрегации.

Обратите внимание, что лучше создать своего исполнителя только один раз, сохранить его в поле экземпляра и повторно использовать (и закрытьпотом вниз)

Если вы работаете в JavaEE 6 или в Spring, вы можете аннотировать свой anotherMethod() с помощью @Asynchronous, и контейнер начнет новый поток для вас.

7 голосов
/ 19 октября 2010

Вы можете запустить его в другом потоке , если нет зависимости .

new Thread(new Runnable(){

      public void run(){
           anotherMethod();
      }  

}).start();
0 голосов
/ 19 октября 2010

Если вы хотите вызвать метод в том же потоке, то сам метод должен обеспечить асинхронную (то есть неблокирующую) реализацию.Обычно это будет включать в себя возврат какого-либо обратного вызова, такого как Future , который вы можете опрашивать / запрашивать позже, чтобы получить фактический результат.Примером этого являются ExecutorService.submit () вызовы - код, который вы вводите, будет выполняться, но в фоновом потоке, что позволит вам в то же время вызывать другие методы.

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

Однако, если метод не предоставляет асинхронный интерфейс, единственный способ заставить его логику работать в другом потоке - это порождать этот поток самостоятельно, как предлагает org.life.java.

...