У меня есть 3 класса задач (I, D, U), которые входят в очередь, задачи одного класса должны обрабатываться по порядку.Я хочу, чтобы задачи выполнялись как можно более параллельно;однако существуют некоторые ограничения:
- U и D не могут работать одновременно
- U, и я не могу работать одновременно
- I (n) требует, чтобы U (n) завершил
Q: Какой шаблон (ы) дизайна подойдет для этого класса проблем?
У меня есть два подхода, которые я рассматриваю:
Подход 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, ожидая при необходимости завершения текущих запланированных задач.