Многопоточность Java: планирование заданий

#java #multithreading

#java #многопоточность

Вопрос:

У меня есть две работы J3 amp; J5 , где,

  1. J3 запускается только после завершения заданий J1 amp; J2
  2. J5 запускается только после завершения задания J4
  3. Эти два задания ( J3 amp; J5 ) должны выполняться в двух разных потоках.
  4. J3 amp; J5 потоки должны выполняться одновременно

Как это можно запрограммировать на Java?

Комментарии:

1. Условие для J3 и J5 не имеет особого смысла … потоки предназначены для того, чтобы быть недетерминированными. ИМХО, лучшим «реальным» решением было бы заставить J3 и J5 зависеть от J1, J2 и J4.

Ответ №1:

Являются ли J1, J2 и J4 также потоками? Вы могли бы передать их в другие свои задания и использовать Thread.join() для ожидания их завершения. Например, первые 3 потока:

 Thread j1 = new Job1Thread();
Thread j2 = new Job2Thread();
Thread j3 = new Job3Thread(j1, j2);
// start them up, etc.

public class Job3Thread extends Thread {
    private final Thread j1;
    private final Thread j2;

    public Job3Thread(Thread j1, Thread j2) {
        this.j1 = j1;
        this.j2 = j2;
    }

    public void run() {
        try {
            j1.join();
            j2.join();
            // now start processing
        } catch (InterruptedException ie) {
        }
    }
}
  

Комментарии:

1. Потоки J3 и J5 должны выполняться одновременно. Как этого можно достичь?

2. Если это домашнее задание, я оставлю эту часть вам 😉 Вам просто нужно расширить то, что я написал для J4 и J5.

3. нет. это не домашнее задание. но я не понимаю, как J3 как один блок задачи, содержащий J1 amp; J2, и J5 как один блок задачи, содержащий J4, могут выполняться параллельно?

4. Создайте J4 и J5 там же, где вы создаете другие потоки. Передайте J4 в J5, как указано выше. Если вы запустите все потоки одновременно, они будут выполняться параллельно с вашими правилами завершения.

5. Я не хочу, чтобы эти два блока ожидали

Ответ №2:

Вы всегда можете создать главный поток, который проверяет состояние различных потоков. Как только он видит, что J1 и J2 выполнены, он запускает J3. Та же логика может быть применена для J4 и J5.

В результате этого J3 и J5 могут выполняться параллельно.

Статус может быть определен путем размещения логического значения в ваших потоках, такого как «выполняется».

Комментарии:

1. ya. Но я хочу, чтобы эти два блока заданий выполнялись параллельно. Master slave — это, безусловно, подход. Я признаю

Ответ №3:

Вы не сказали, что задания J1 и J2 должны быть параллельными, поэтому проще всего сделать

 // thread one
J1();
J2();
J5();

// thread two
J3();
J4();
  

Самый простой способ заставить одну задачу следовать за другой — это выполнять вызовы методов в одном потоке один за другим. 😉

Комментарии:

1. я тоже думал об этом подходе .. но что, если J3-> J1 amp; J2 — это один блок, а J5-> J4 — это один блок, и эти блоки нужно выполнять параллельно .. вы намекаете на разветвление?