Повторное использование вызываемого экземпляра, похоже, работает. Это нормально, хотя?

1

Моя программа представляет собой бесконечный цикл. Перед входом в цикл я создаю два вызова. Каждый из них выполняет HTTP-запрос, который нужно запускать параллельно и возвращать результат. Это разные классы java, и они не разделяют никаких атрибутов/данных. Тем не менее, они оба обновляют свои собственные внутренние атрибуты, какие-то счетчики, которые мне нужно сохранить с самого начала программы, пока я не остановлю ее.

Мой код выглядит так. Пожалуйста, простите меня, если это ужасно, я не кодировал 6 лет.

callable1 = new Callable1();
callable2 = new Callable2();

while(true) {

  //Preparation of the dynamic parameters
  ...
  callable1.setData(some_dynamic_parameters1); 
  callable2.setData(some_dynamic_parameters2);

  ExecutorService threadPool = Executors.newFixedThreadPool(2);
  CompletionService<String> completion = new ExecutorCompletionService<String>(threadPool);
  completion.submit(callable1);
  completion.submit(callable2);
  threadPool.shutdown();

  //I need to wait for both tasks to complete before going further
  String firstReply = completion.take().get();
  String secondReply = completion.take().get();
  ...

}

Код для обоих вызовов выглядит следующим образом. Они отличаются деталями метода call().

public class callable1 extends Callable {

  private counters = new PositionCounters();
  private data = null;

  public void setData(data) {
    this.data = data;
  }

  public String call() {
    //Create HTTP query from information contained in [data]
    ...
    //update internal counter.
    counters.update(query_result)
  }
}

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

Спасибо за вашу помощь !

  • 0
    Какой код для вызываемых?
  • 0
    Callable1/2 ли создание Callable1/2 занимает так много времени, что вам нужно использовать их повторно? HTTP-запросы будут занимать гораздо больше времени, так что это не совсем горячая точка оптимизации.
Показать ещё 4 комментария
Теги:
callable

1 ответ

1

Вызываемый - это не поток, а просто оболочка для кода, который будет выполняться потоком. Вы можете повторно использовать его, если его состояние не устарело или вы можете его сбросить (или оно модифицировано так, чтобы следующий запуск просто нуждался в этом состоянии и т.д.). Тем не менее вы должны определить, действительно ли это решает проблему с производительностью, поскольку это, по-видимому, 2 конструкции объекта для каждого вызова (+GC).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню