【问题标题】:java designing tasks in concurrent mechanismjava在并发机制中设计任务
【发布时间】:2009-01-16 19:10:19
【问题描述】:

我正在设计一个基于任务的多线程 java 1.5 系统。

任务通常会与集合交互以确定失败或成功的匹配事件。根据结果​​,另一个任务可能会排队等待 IO 事务,以通知客户端和/或存储有关事务的重要信息。

Java 为线程池和任务管理提供了一组丰富的并发工具,但我正在尝试为任务本身提出最佳设计。

例如:每个任务都应该引用集合吗?任务应该如何初始化?等等……

有没有人知道好的编码示例或说明一些不同设计可能性的任何参考资料。

【问题讨论】:

  • 这个问题对我来说有点模糊。也许尝试加强对您要制作的内容的描述?

标签: java multithreading concurrency


【解决方案1】:

任何尝试在 Java 中执行多线程的人都应该阅读 Brian Goetz 的 "Java Concurrency In Practice"

您不应该尝试使用低于版本 5 的任何 JDK。那是 java.util.concurrent 包首次出现的时候。

【讨论】:

  • 他说他已经在使用 Java 1.5,我认为“用于线程池和任务管理的丰富并发工具集”可能是指 java.util.concurrent。但是这本书绝对是一个有效的观点。
  • 嗯,我同意 JCIP 是最好的 Java 并发书籍。但是我在 JDK 5 之前写了很多成功的并发代码。:) 此外,还有一个用于 java.util.concurrent 的后端库。
  • 两者都是真的。但是 JDK 1.4 已经走到了生命的尽头,所以除非你有一个无法升级的遗留应用程序,否则我建议至少从 JDK 5 开始。JDK 6 现在是通用发布版本。为什么要谈论 1.4?
【解决方案2】:

一个可行的策略是让每个任务引用一个共享的线程安全集合。这可行,但对于您如何使用集合(最重要的是您是否正在修改它)和预期的并发性有一些明显的限制。如果您需要从任务中修改集合,您将在共享集合上产生某种程度的写入争用。根据线程数、哪个集合(线程安全与并发)等,这可能是一个瓶颈。甚至读取也可能导致某些集合类型的争用。

另一种选择是为每个任务提供所需的输入,让它计算结果,然后对结果进行后处理。这可以并行或不并行完成,具体取决于您的需要。

在任何情况下,您都绝对应该使用 ExecutorService,因为它可以让您结合线程池和请求队列,线程将在必要时拉取并执行任务。如果有用,CompletionService 还可以添加结果队列。

【讨论】:

    猜你喜欢
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    • 2013-02-05
    • 1970-01-01
    • 2016-08-14
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多