Эффективно поток из очереди Redisson в другую

Предположим, распределенная очередь

BlockingQueue<RequestInfo> queueA; // from redisson

и я делаю queueA.take в цикле и создать новый Runnable с использованием RequestInfo объект и кормление это в ExecutorService с X темы. Но даже если я использую ограниченный BlockingQueue только размера 1, будет элемент, ожидающий свободного потока, который потенциально может быть обработан с другого компьютера.

Т.е. требование состоит в том, чтобы это делали только queueA.take если один из потоков X простаивает.

В моем первом подходе я использовал Semaphore ограничено X. Это сработало, но это кажется немного странным, поскольку это дублирует ограничение ExecutorService.

Второй подход, который я могу себе представить, это ExecutorService с SynchronousQueue:

new ThreadPoolExecutor(X, X, 0, TimeUnit.MILLISECONDS, new SynchronousQueue<>());

Может ли это работать и есть ли лучшие возможности?

Или я могу как-то создать очередь Runnable S в Redisson и использовать это непосредственно в ThreadPoolExecutor? Полагаю, что в этих случаях (де) сериализация будет сложной, хотя при десериализации у меня есть все необходимые классы в Runnable.

Обновление: похоже, что в Redisson есть "распределенные сервисы", которые могут помочь в этом, но они не обязательно более эффективны, поскольку также используются две очереди, и неясно, можно ли перегружать ExecutorService, поскольку они используют простую неограниченную блокировку в очереди Примеры.

Обновление: решение с SynchronousQueue, похоже, не работает

0 ответов

Другие вопросы по тегам