2015-11-12 1 views
1

Я новичок в программировании, в моей компании у нас есть система бронирования. Для нашего ПО я получаю XML-запрос к нашему сервису. когда мы получаем запрос на наш сервис. мы создаем поток и обрабатываем его. Это программное обеспечение отлично работает. Но в последнее время у нас появилась новая проблема. Один из наших клиентов отправляет свою информацию о бронировании (например, 10000 XML) в час X (например, 1: AM) каждый день. Программное обеспечение ведет себя, мы создаем 10000 потоков. Затем мы получаем OutOfMemorryError. Чтобы улучшить это, мы собираемся реализовать с Executors. Мой вопрос: мы используем лучший способ обработки 10000 запросов?
Любые предложения будут оценены.Как обрабатывать n запросов в многопоточности

+0

Возможно, вы должны спросить одного из своих старших разработчиков .... – redFIVE

+0

Я бы предложил использовать java.nio, где вы можете использовать набор потоков для обслуживания большого количества подключений. Также можно посмотреть netty, который представляет собой реализацию nio с использованием модели конвейерной обработки. – DBug

+0

@redFIVE Согласен. Однако, если бы они знали решение, такая архитектура никогда не была бы создана в первую очередь. И это немного беспокоит, что ни один из старших разработчиков не знает о пулах потоков ... –

ответ

2

Создание Executor, который имеет максимальное количество потоков, например .:

ThreadPoolExecutor executor 
    = new ThreadPoolExecutor(50, 50, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<>()); 
executor.allowCoreThreadTimeOut(true); 

первых 50 corePoolSize, второй 50 maximumPoolSize. Разница в том, что больше чем corePoolSize потоков будет создано только в том случае, если очередь заполнена.

Мы не хотим иметь 50 простоя, поэтому мы даем им время ожидания (allowCoreThreadTimeOut(true)) через 60 секунд.

Возможно, вы также захотите установить максимальную емкость в очереди. Если все потоки заняты, а очередь заполнена, исключение будет выбрано (а не OutOfMemoryError при попытке добавить слишком много в очередь).

Затем вы просто вызываете executor.submit(...) и даете ему Runnable или Callable в качестве параметра.

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