[是否] 将工作线程专用于一组特定的对象是一种更好/更快的方法吗?
我假设总体目标是尝试最大化这些入站消息的并发处理。您有来自 3 个来源的接收器,它们需要将消息放入将得到最佳处理的池中。因为来自 3 个源中的任何一个的消息可能会处理无法同时处理的相同目标对象,所以您希望以某种方式划分消息以便可以同时处理它们,但前提是它们保证不会引用相同的目标对象。
我将hashCode()
在您的目标对象(可能只是name.hashCode()
)上实现该方法,然后使用该值将对象放入一个BlockingQueue
s 数组中,每个对象都有一个使用它们的线程。使用数组Executors.newSingleThreadExecutor()
就可以了。通过队列数修改哈希值模式并将其放入该队列中。您需要将处理器的数量预先定义为最大值。取决于处理的 CPU 密集程度。
所以类似下面的代码应该可以工作:
private static final int NUM_PROCESSING_QUEUES = 6;
...
ExecutorService[] pools = new ExecutorService[NUM_PROCESSING_QUEUES];
for (int i = 0; i < pools.length; i++) {
pools[i] = Executors.newSingleThreadExecutor();
}
...
// receiver loop:
while (true) {
Message message = receiveMessage();
int hash = Math.abs(message.hashCode());
// put each message in the appropriate pool based on its hash
// this assumes message is runnable
pools[hash % pools.length].submit(message);
}
这种机制的好处之一是您可以限制有关目标对象的同步。你知道同一个目标对象只会被一个线程更新。
人们是否同意将工作线程专用于一组特定对象是一种更好/更快的方法的假设?
是的。这似乎是获得最佳并发性的正确方法。
假设这是一种更好的方法,现有的 Java ThreadPool 类是否有办法支持这一点?还是需要我们编写自己的 ThreadPool 实现?
我不知道有任何线程池可以做到这一点。但是,我不会编写您自己的实现。只需像上面的代码大纲一样使用它们。