Предположим, что распределенная очередь
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, поскольку они используют простую неограниченную BlockingQueue в примерах.
Обновление: решение сSynchronousQueue, похоже, не работает