【发布时间】:2012-11-01 03:57:07
【问题描述】:
我们正在开发一个应用程序,其中一组对象可以通过接收来自 3 个不同来源的消息而受到影响。每条消息(来自任何来源)都有一个对象作为其目标。每个消息接收器都将在自己的线程上运行。
我们希望消息的处理(接收后)尽可能高速,因此针对目标对象的消息处理将由线程池中的另一个线程完成。消息的处理将比阅读/接收来自发件人的消息花费更长的时间。
我认为如果池中的每个线程只专用于一组特定的对象会更快,例如:
Thread1 -> objects named A-L
Thread2 -> objects named M-Z
每组对象(或线程)都有一个专用的待处理消息队列。
我的假设是,如果唯一需要的线程同步是在每个接收线程和一个处理线程之间,在需要将消息放入阻塞队列的持续时间内,它会比随机分配工作线程更快处理消息(在这种情况下,可能有 2 个不同的线程处理同一对象的消息)。
我的问题实际上是两部分:
人们是否同意专用工作线程的假设 对一组特定的对象是更好/更快的方法吗?
假设这是一种更好的方法,请执行现有的 Java ThreadPool 类有办法支持这一点吗?还是需要我们编码 我们自己的线程池实现?
感谢您提供的任何建议。
【问题讨论】:
-
所以诀窍是不能让 2 条具有相同目标对象的消息同时被不同的线程处理?
-
你有没有做过任何测试,看看这是否是一个问题?
-
@Gray:是的 - 同一目标对象的 2 条消息中的每一条都将更新目标对象的状态,并且还可能触发生成另一条消息。这两条消息绝对不允许同时更新对象(即没有同步),因为这可能导致对象的状态不一致(如并发线程所见)。
-
@MattiLyra:从其他类似应用程序的性能来看,我们知道接收延迟与处理延迟之间存在不平衡。关于并发线程是否会看到不一致的状态(如果没有按照我的建议进行同步或专用),我不能 100% 确定 - 但这是一个合理的假设。
-
但是如果目标对象必须同步,那么划分对象集的意义何在?为什么要将对象分成 A-L M-Z?
标签: java multithreading threadpool