gpt4 book ai didi

java - Java中线程安全队列和 "master/worker"程序的模式/原则

转载 作者:搜寻专家 更新时间:2023-10-30 21:24:37 26 4
gpt4 key购买 nike

我有一个问题,我认为这是经典的主/ worker 模式,我正在寻求有关实现的建议。这是我目前正在考虑的问题:

有某种全局“队列”,它是保存“待完成工作”的中心位置。大概这个队列将由一种“主”对象管理。将产生线程去寻找要做的工作,当它们找到要做的工作时,它们会告诉主事物(不管它是什么)“将它添加到待完成的工作队列中”。

master,也许在一个时间间隔内,会产生其他线程来实际执行要完成的工作。一旦一个线程完成它的工作,我希望它通知主人工作已经完成。然后,master 可以从队列中删除这个工作。

我过去用 Java 进行过大量的线程编程,但都是在 JDK 1.5 之前进行的,因此我不熟悉用于处理这种情况的适当的新 API。我了解 JDK7 将具有 fork-join,这对我来说可能是一个解决方案,但我无法在此项目中使用早期访问产品。

在我看来,问题是:

1) 如何让“执行工作的线程”与 master 通信,告诉他们他们的工作已完成,master 现在可以从队列中删除工作

2) 如何有效地让 master 保证工作只被安排一次。例如,假设这个队列有一百万个项目,它想告诉一个工作人员“去做这 100 件事情”。什么是最有效的方式来保证当它安排下一个工作人员工作时,它得到“接下来的 100 件事”而不是“我已经安排的 100 件事”?

3) 为队列选择合适的数据结构。我在这里的想法是,“线程寻找工作”可能会多次找到相同的工作,并且它们会向主人发送一条消息说“这是工作”,主人会意识到工作已经完成已安排,因此应忽略该消息。我想确保我选择了正确的数据结构,以使这种计算尽可能便宜。

传统上,我会在数据库中以有限状态机的方式完成此操作,从头到尾处理“任务”。但是,在这个问题中,由于队列的高容量和易变性,我不想使用数据库。此外,我希望它尽可能轻便。如果可以避免,我不想使用任何应用服务器。

我描述的这个问题很可能是一个常见问题,具有众所周知的名称和公认的解决方案集,但我的非 CS 学位很低,不知道这叫什么(即请温柔点)。

感谢所有指点。

最佳答案

据我了解你的要求,你需要ExecutorService . ExecutorService 有

submit(Callable task)

返回值为Future的方法. Future 是从 worker 到 master 的一种阻塞方式。您可以轻松地扩展此机制以异步方式工作。是的,ExecutorService 也像 ThreadPoolExecutor 一样维护工作队列。因此,在大多数情况下,您无需为日程安排而烦恼。 java.util.concurrent 包已经具有线程安全队列的高效实现(ConcurrentLinked 队列 - 非阻塞,和 LinkedBlockedQueue - 阻塞)。

关于java - Java中线程安全队列和 "master/worker"程序的模式/原则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1164678/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com