2013-02-26 4 views
0

У меня есть следующий сценарий, который должен быть изменен, как можно скорее:
1. Группа последовательных нитей выполняет (содержит 3 темы)
2. Группа другого последовательного нити (исполняет содержит 2 нити)
3. группа из параллельных потоков выполняет (содержит 9 нитей таким образом, что производитель-потребитель подход резьбы применяется правильно)Выполнение последовательных операций для групп параллельных потоков

Почему я создал этот сценарий?

Чтобы выполнить определенные потоки сначала (точка-1: содержит 3 потока), после их обработки я должен выполнить еще 2 потока (точка-2: содержит 2 потока). Если и только если 1 и 2 точки покрыты, мне необходимо обработать точку-3.

Первоначально я должен был выполнить все потоки для обработки параллельных операций, но я оставил эту идею, поскольку параллельные потоки будут выполняться одновременно.

Для вышеуказанной ситуации все работает плавно, пока не возникла какая-либо проблема.

Почему мне нужно изменить описанный выше сценарий?

Иногда я получаю Исключение, которое можно обрабатывать хорошо в случае параллельных потоков. Хотя это же Исключение, если я получаю в Последовательные потоки, которые становятся неспособными обрабатывать. Так как вся другая обработка последовательных потоков переходит в состояние ожидания до тех пор, пока первая не завершится.


Итак, мне нужно воспользоваться преимуществами параллельных потоков, но я выбрал этот способ, чтобы быть легким, что стало трудно справиться с ситуацией для приложения.
Итак, мне нужно создать такой сценарий, в котором я должен выполнять разные параллельные потоки для фиксированного порядка. Например:

заказ первого = процесс первых 3 параллельных нити
заказ второго = процесс следующих 2 параллельных потоки
заказ 3rd = Процесс следующие 9 параллельные нити

Кроме , приведенный выше случай несколько ограничен, хотя для этого мне нужно общее решение. Например, если в будущем я хочу добавить еще 2 потока из Order-1 или, если я даже удалю некоторые потоки для любого порядка, последовательность групп должна выполняться по желанию.
Есть ли какой-либо способ в java, через который мы можем создать группу параллельных потоков, чтобы они могли выполняться для любого порядка, который мы можем указать?

Редактировать
У меня есть следующий фрагмент кода, если вы можете помочь мне изменения:

// Уровень-1

Thread[] threads = new Thread[list1.size()]; 
int j=0; 
for(list1.size()){ 
    Object delegator1 = new Object("Level-1"); 
    Thread th = new Thread(delegator1); 
    threads[j]=th; 
    th.start(); 

    j++; 
} 
for(Thread thread: threads){ 
    thread.join(); 
} 

// Уровень-2

threads = new Thread[list2.size()]; 
j=0; 
for(list2.size()){ 
    Object delegator2 = new Object("Level-2"); 
    Thread th = new Thread(delegator2); 
    threads[j]=th; 
    th.start(); 

    j++; 
} 
for(Thread thread: threads){ 
    thread.join(); 
} 

// Level-3 & 4 -> Applied Producer-Consumer с использованием wait-notify работает нормально.

for(list3.size()){ 
    Object delegator3 = new Object("Level-3 & 4") 
    Thread th = new Thread(delegator3); 
    th.start(); 
} 

Я хочу, чтобы эти различные уровни, чтобы выполнить параллельно, но если первый уровень завершает второй уровень должен после этого выполняет.

+0

Вы пытались использовать многоуровневый потребитель-производитель? Я имею в виду, что Order-1 будет производителем для Order-2, а Order-2 станет потребителем для группы нитей Order-3. – Santosh

+0

Нет. Я не пробовал многоуровневого производителя. Поскольку таким образом количество выполняемых потоков будет ограничено. Значит, если в будущем мне нужно добавить еще 50 адов на уровень 1, тогда смена кода не должна быть выполнена. Если мы сможем справиться без какого-либо изменения кода, пожалуйста, помогите мне сохранить эту иерархию. – Sanchit

+0

Не совсем, вы всегда можете сохранить количество потоков, настраиваемых через некоторый файл свойств. Приложение будет читать конфигурацию при запуске. – Santosh

ответ

0

Если вы просто хотите дождаться завершения набора потоков, вы можете использовать, например, CountDownLatch в основном потоке, инициализированном количеством потоков. Затем основной поток ожидает завершения каждой нити и уведомления защелки.

Повторите для следующих комплектов.

Что в конечном итоге решило мою проблему.

1

Итак, похоже, что у вас есть несколько состояний для ваших ордеров-экземпляров. Состояние: Заказ-1, Заказ-2, Заказ-3 и Сбой.

Вы можете использовать Producer-Consumer-Queues для реализации этих состояний (или даже одной очереди для всех). В зависимости от результата операции экземпляры перемещаются в очередь «next», которая обрабатывается количеством потоков, которое вам нужно.

При использовании одной очереди, возможный способ обработки это может быть Envelope-Object, который содержит вычисление, как

class Order1Processor implements Runnable { 
    Object delegate; 
    Order1Processor(Object delegate) { this.delegate = delegate; } 
    public void run() { 
     try { 
      // do the Order-1st processing 
      doSomethingWith(delegate); 
      // submit to next free Thread for Order-2nd processing 
      submitToQueue(new Order2Processor(delegate)); 
     } catch (Throwable t) { 
      // signal/handle failure 
      submitToQueue(new FailedProcessor(delegate, t)) 
     } 
} 


} 
class Order2Processor .. 

теперь вы можете использовать столько потоков, сколько вы хотите обрабатывать ваши заказы. Одиночная очередь позволяет вам автоматически назначать столько ресурсов, сколько необходимо, в зависимости от текущей работы. Вы даже можете использовать PriorityQueue, если у вас есть некоторые Заказы или Операции над ними, которые должны быть обработаны раньше или в определенной последовательности.

+0

ОК, похоже, выполнимо. Я сообщу вам, если возникнет какая-либо проблема с обработкой описанного выше решения. – Sanchit

Смежные вопросы