Как обрабатывать RejectedExecutionException с ThreadPoolExecutor в Java - PullRequest
6 голосов
/ 23 февраля 2012

Каков наилучший способ обработки RejectedExecutionException при использовании ThreadPoolExecutor в Java?

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

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

Был бы рад, если бы люди могли поделиться своим опытом.

Добавление возможного решения, которое я хотел бы из:

while(executor.getQueue().remainingCapacity <= 0){
// keep looping
Thread.sleep(100);
};
//if the loop exits ,indicates that we have space in the queue hence 
//go ahead and add to the queue 
executor.execute(new ThreadInstance(params));

Ответы [ 2 ]

3 голосов
/ 23 февраля 2012

Я бы изменил поведение вашей очереди. например,

public class MyBlockingQueue<E> extends ArrayBlockingQueue<E> {
    private final long timeoutMS;

    public MyBlockingQueue(int capacity, long timeoutMS) {
        super(capacity);
        this.timeoutMS = timeoutMS;
    }

    @Override
    public boolean offer(E e) {
        try {
            return super.offer(e, timeoutMS, TimeUnit.MILLISECONDS);
        } catch (InterruptedException e1) {
            Thread.currentThread().interrupt();
            return false;
        }
    }
}

Это будет ожидать истощения очереди, прежде чем сдаться.

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

Если вы ограничили свой пул потоков разрешением только определенного количества одновременных потоков (как правило, это хорошо), то приложению необходимо каким-то образом отодвинуть вызывающий код, поэтому при получении исключения RejectedExecutionException от ThreadPoolExecutor вы необходимо указать это вызывающей стороне, и вызывающая сторона должна будет обработать повторную попытку.

Аналогичная ситуация - веб-сервер под большой нагрузкой. Клиент подключается, веб-сервер должен вернуть 503 - Служба недоступна (как правило, временное состояние), и клиент решает, что с этим делать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...