java - 管理执行同一任务的线程的最合适方法是什么?

标签 java multithreading algorithm

我在数据库 (PostgreSQL) 中有很多数据,需要处理所有数据。我的程序有线程来处理所有这些数据并遵循这些逻辑。

  1. 从数据库中获取部分数据
  2. 过程
  3. 保存数据

我怀疑最好的方法是什么。我有三个想法:

  • 创建一个在循环中运行的管理器类,该类从数据库获取数据并保存要处理的对象队列。创建一个在循环中运行的进程类,从管理器类获取要处理的对象。

  • 与上面相同,但没有管理器类,因此进程类将在它之间共享对象队列,它们也将负责从数据库中获取数据。

  • 在循环中运行的管理器类从数据库中获取数据,但它会创建包含要处理的数据的进程类,因此进程类不会向管理器请求任何内容。它被创建、处理和销毁,而不是循环运行。

我不知道什么更好,是否还有其他更有效的解决方案。

最佳答案

您描述的是所谓的经理- worker 模型。我认为你的第一个描述更好。

它将数据推送到队列中并由多个工作进程处理。您可以为 worker 使用线程池。 worker 们正在排队等候。一旦工作被推送到队列中,其中一名 worker 立即接手。完成后,他们可以将结果插入传出队列,然后另一个线程将数据发送到数据库。或者,每个 worker 都可以自己保存结果。这取决于你,取决于你的任务。

用户 Excecutors 和 BlockingQueue 用于实现。所有你需要的都在 java.util.concurrent 包中,你可以在网络上找到很多教程和示例如何使用它们。

祝你好运。

关于java - 管理执行同一任务的线程的最合适方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6750680/

相关文章:

java - Spring LDAP 3.1 自定义用户映射器

Java3D获取时间问题

algorithm - oracle生成16位随机数

java - Android 线程阻塞 UI 除非使用同步

multithreading - 如何避免可变状态(多线程时)

algorithm - 将 X 中的所有 x_i 分成 K 组 s.t. var(sum(x in k) for k in K) 被最小化

algorithm - 图实现、函数和参数。什么更有意义?

Java图形随机文本

java - 如何知道 Android Java 中网页的最后修改日期和时间

java - 什么是NullPointerException,我该如何解决?