我想出一个基于任务的多线程java 1.5系统的设计。
任务通常会与集合进行交互,以确定失败或成功的匹配事件。根据结果,可以将另一个任务排队等待IO事务,以通知客户和/或存储有关交易的重要信息。
Java为线程池和任务管理提供了丰富的并发工具集,但我正在尝试为任务本身提供最佳设计。
例如:每个任务是否应该引用该集合?如何初始化任务?等...
是否有人知道好的编码示例或任何说明一些不同设计可能性的参考文献。
答案 0 :(得分:3)
任何尝试用Java进行多线程处理的人都应该阅读Brian Goetz的"Java Concurrency In Practice"。
你不应该使用任何低于版本5的JDK来尝试它。那就是当java.util.concurrent包首次出现时。
答案 1 :(得分:0)
一个可行的策略是每个任务引用共享的线程安全集合。这有效,但是对于如何使用集合(最重要的是你是否正在修改它)以及预期的并发性有一些明显的限制。如果需要从任务修改集合,则会在共享集合上产生一定程度的写入争用。根据线程数,哪个集合(线程安全与并发)等,这可能是一个瓶颈。即使是读取也可能导致某些集合类型的争用。
另一个选择是为每个任务提供所需的输入,让它计算结果,然后对结果进行后处理。这可以并行完成,也可以不同,具体取决于您的需求。
在任何情况下都应该使用ExecutorService,因为它允许您组合线程池和请求队列,线程将根据需要提取和执行任务。如果有用,CompletionService还可以添加结果队列。