【发布时间】:2011-05-12 07:01:19
【问题描述】:
我有 3 类任务(I、D、U)进入队列,同一类的任务必须按顺序处理。我希望任务尽可能同时运行;但是有一些限制:
- U 和 D 不能同时运行
- 你和我不能同时运行
- I(n) 要求 U(n) 已完成
问:什么设计模式适合这类问题?
我正在考虑两种方法:
方法 1: 每个任务使用 1 个线程,每个任务都有自己的队列。每个线程都有一个同步启动阶段,它检查启动条件,然后运行,然后是一个同步停止阶段。很容易看出这将提供良好的并发性,但我不确定它是否正确实现了我的约束并且不会死锁。
D_Thread { ...
while (task = D_Queue.take()) {
synchronized (State) { // start phase
waitForU();
State.setRunning(D, true);
}
run(task); // run phase
synchronized (State) { // stop phase
State.setRunning(D, false)
}
}
}
方法 2: 或者,单个调度线程管理执行状态,并在 ThreadPool 中调度任务,并在必要时等待当前调度的任务完成。
【问题讨论】:
-
您能否详细说明第三个约束? I 和 U 是成对出现的,每个 I 都需要成对的 U,还是没有这样的对,只是完成的 I 的数量不能大于完成的 U 的数量?还是别的什么?
-
2) 每类任务的时间成本是多少?它们需要大约相同的时间来完成吗?
-
两者兼而有之。 U(n) 是一种缓存刷新,它意味着 U(n-1) U(n-2) ... 等等;因此可以一次处理多个。每个操作都有一个与之关联的位置;所以 D(k) 实际上为 U(k) 创建了一个需求。它们只是作为例子;我不是要求人们完全解决这个问题。只是推荐一些设计模式。
标签: multithreading design-patterns concurrency scheduled-tasks