假定分布式队列
BlockingQueue<RequestInfo> queueA; // from redisson
,然后我循环执行queueA.take
,并使用Runnable
对象创建一个新的RequestInfo
并将其馈入带有X线程的ExecutorService
中。但是,即使我使用大小仅为1的有界BlockingQueue,在本地也会有一个项目在等待一个空闲线程,该线程可能会从其他计算机上进行处理。
即要求是仅在X个线程之一处于空闲状态时才执行queueA.take
。
在我的第一种方法中,我使用了一个限制为X的Semaphore
。虽然可行,但由于它重复了ExecutorService的限制,因此感觉有点奇怪。
我可以想象的第二种方法是将ExecutorService
与SynchronousQueue
一起使用:
new ThreadPoolExecutor(X, X, 0, TimeUnit.MILLISECONDS, new SynchronousQueue<>());
这行得通吗,还有更好的可能性吗?
或者我可以以某种方式在Redisson中创建Runnable
的队列并直接在ThreadPoolExecutor
中使用它吗?我想在这些情况下很难进行反序列化,尽管反序列化时我拥有了Runnable所需的所有类。
更新:似乎有"distributed services" in Redisson可以在这里提供帮助,但是它们并不一定要效率更高,因为还使用了两个队列,还不清楚ExecutorService是否可以重载,因为它们使用了一个简单的无边界BlockingQueue在示例中。
更新:使用SynchronousQueue的解决方案似乎不起作用