2017-01-27 5 views
1

Я использую JerseyClient для асинхронных вызовов на http-сервере и непосредственно создаю Futures для хранения ответа. Это может быть даже пакетный вызов, в этом случае я создаю список фьючерсов.Создание фьючерсов без ExecutorService или FutureTask

Это прекрасно работает, но меня беспокоит использование процессора и количество потоков, поскольку я не создаю пул потоков с помощью службы Executor, и я не использую FutureTask <> для создания фьючерсов.

Небольшой фрагмент кода, как я построения каждого будущего:

Future<Response> response = requestBuilder.async().get(); 

ли эти опасения справедливы? Можно ли продолжать этот подход? Будет ли этот подход не масштабироваться?

Другая проблема заключается в том, что get() никогда не может быть выполнен на некоторых из этих фьючерсов? Это приведет к появлению нерестовых нитей, которые никогда не будут убиты, потому что не выполняются ни get(), ни cancel() для фьючерсов, работающих в этих потоках?

ответ

0

Это всегда лучше контролировать количество threads создаваемого приложения так при вызове REST API с помощью Jersey async API, вы должны ограничить количество threads созданного.

Ниже код может быть использован для контроля максимального количества threads созданного jersey client в async API -

ClientConfig cc = new ClientConfig(); 
    cc.property(ClientProperties.ASYNC_THREADPOOL_SIZE , 10); 

    Client client = ClientBuilder.newClient(cc); 

Другой момент, связанный с get() вызов метода будущего, например, get() метод просто метод блокировки, который сделает вашу current thread дождаться завершения future task в этом случае для получения response, это не повлияет на выполнение threads. Таким образом, не должно быть никаких проблем, если вы не вызываете get() или cancel() в ответе Future экземпляра.

Смежные вопросы