Эффективно поток из очереди 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, похоже, не работает