Многопоточность с CachedThreadPool - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть архитектура взаимодействия сервер-клиент, где есть один сервер и 150 клиентов. Связь сервер-клиент происходит через Java NIO, где все клиенты отправляют те или иные данные каждые 10 секунд.Раньше мы ставили в очередь все сообщения процесса и обрабатывали все сообщения в одном потоке, так как количество клиентов больше, так как сообщения, сервер не может обрабатывать все сообщения мгновенно, и существует задержка обработки данных в очередипотеря.Поэтому я подумал о реализации CachecThreadPool для одновременной обработки задач, как только они появятся. Я выбрал CachedThreadPool вместо FixedThreadPool, потому что задачи недолговечны и их много, ниже приведен код для этого.Поток, который получает сообщения от клиентов, звонит ProcessorClass.processData(message), как только получает сообщение.

public class ProcessorClass{

private static final Logger LOGGER = Logger.getLogger(ProcessorClass.class);
static ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newCachedThreadPool();

public static void processData(StringBuffer message) {
    Runnable task = new Runnable() {
        @Override
        public void run() {
            try {
                LOGGER.info("Queue size:"+executor.getQueue().size());
                if (message != null){
                    processMessage(message);
                }
            }
            catch(Exception e) {
                LOGGER.error("Error happened in run() method" + e.getMessage());
            }

        }
    };
    executor.execute(task);
}
public static void processMessage(StringBuffer message){
    // all the processing of message such as DB operations goes here.
}
}

Сомнения:

1.How CachedThreadPool stores the message in the queue because i haven't defined any explicitly.
2.Should i chose FixedThreadPool over this?
3.Should i make my processMessage() method synchronized?

Все предложения и комментарии рецензии приветствуются.

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Как CachedThreadPool хранит сообщение в очереди, потому что я не определил его явно.

CachedThreadPool не сохраняет ваше сообщение в очереди.getQueue получает задачи, которые вы отправили в очередь.

Должен ли я выбрать FixedThreadPool вместо этого?

CachedThreadPool более гибок, так как будет расти и уменьшать количество потоков.Проблема в том, что он может вырасти слишком сильно и вызвать OOM.FixedThreadPool не будет расти или уменьшаться, но часто бывает достаточно, если вы знаете, что делаете.Подсказка: выполните мониторинг и профилирование, чтобы определить, сколько потоков вам нужно.

Должен ли я синхронизировать мой метод processMessage ()?

Не зная деталей реализации методаМы не можем посоветовать, нужно ли вам синхронизировать это.Этот метод, безусловно, должен быть поточно-ориентированным, но если вы просто добавите synchronized к методу, я ожидаю, что производительность будет даже хуже, чем если бы вы просто запустили все в 1 потоке.

0 голосов
/ 22 ноября 2018

Executors.newCachedThreadPool и Executors.newFixedThreadPool имеют одинаковую реализацию пула потоков только с разными параметрами.Различия заключаются в их минимуме, максимуме, времени завершения потока и типе очереди.

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

CachedThreadPool не будет ограничивать количество потоков в пуле потоков.Может расти MAX_VALUE от Integer.

...