Превышено ограничение на поток, заменяющий заблокированного рабочего

Я использую AsyncHttpClient и делаю много HTTP-запросов параллельно. Я получаю следующую ошибку:

java.util.concurrent.RejectedExecutionException: Thread limit exceeded replacing blocked worker

Как я могу сделать так, чтобы новый запрос ждал, пока не появится свободный поток?

Мой код:

public class MyClass {
    private AsyncHttpClient asyncHttpClient = new DefaultAsyncHttpClient();

    public JSONObject jsonFromUrl(String requestUrl) {
        CompletableFuture<Response> futureResponse = asyncHttpClient.prepareGet(requestUrl).
                addHeader("header-name", "header-value").execute().toCompletableFuture();
        try {
            Response response = futureResponse.get();
            ... handling response
        } catch (Exception e) {
            ... handling exception
        }
    }
}

person Yigal    schedule 08.06.2017    source источник


Ответы (1)


Вы можете реализовать и установить RejectedExecutionHandler для пула потоков, который обрабатывает отклоненные задачи, добавляя их в рабочую очередь исполнителя.

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/RejectedExecutionHandler.html

threadPoolExecutor.setRejectedExecutionHandler(new RejectedExecutionHandler() {
    @Override
    public void rejectedExecution(Runnable task, ThreadPoolExecutor executor) {
        try {
            executor.getQueue().put(task);
        } catch (InterruptedException e) {
            // handle exception
        }
    }
});

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

person Luciano van der Veekens    schedule 08.06.2017