我们正在开发一个应用程序,其中一组对象可能会受到来自 3 个不同源的消息的影响。每条消息(来自任何源)都有一个对象作为其目标。每个消息接收器将在其自己的线程上运行。
我们希望消息的处理(接收后)尽可能高速,因此针对目标对象的消息处理将由线程池中的另一个线程完成。消息的处理将比从发送者读取/接收消息花费更长的时间。
我认为如果池中的每个线程仅专用于一组特定的对象,那么速度会更快,例如:
Thread1 -> objects named A-L
Thread2 -> objects named M-Z
每组对象(或线程)都有一个专用的消息队列等待处理。
我的假设是,如果唯一需要的线程同步是在每个接收线程和一个处理线程之间,那么在需要将消息放入阻塞队列的持续时间内,它将比随机分配工作线程来处理消息更快。消息(在这种情况下,可能有 2 个不同的线程包含同一对象的消息)。
我的问题实际上分为两部分:
人们是否同意专用工作线程的假设
对于一组特定的对象是更好/更快的方法吗?
假设这是一个更好的方法,现有的 Java 线程池类是否有办法支持它?或者是否需要我们编写自己的线程池实现?
感谢您提供的任何建议。
将工作线程专用于一组特定的对象是更好/更快的方法吗?
我认为总体目标是尝试最大化这些入站消息的并发处理。您有来自 3 个来源的接收者,需要将消息放入将得到最佳处理的池中。因为来自 3 个源中任何一个的消息都可能处理同一个目标对象,cannot如果要同时处理,您希望以某种方式划分消息,以便可以同时处理它们,但前提是保证它们不引用相同的目标对象。
我将实施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);
}
此机制的好处之一是您可以限制有关目标对象的同步。你know同一目标对象只能由单个线程更新。
人们是否同意这样的假设:将工作线程专用于一组特定的对象是更好/更快的方法?
是的。这似乎是获得最佳并发性的正确方法。
假设这是一个更好的方法,现有的 Java 线程池类是否有办法支持它?或者是否需要我们编写自己的线程池实现?
我不知道有任何线程池可以完成此任务。我会not不过,请编写您自己的实现。只需像上面的代码概述一样使用它们即可。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)