#java #multithreading
#java #многопоточность
Вопрос:
У меня есть две работы J3 amp; J5
, где,
J3
запускается только после завершения заданийJ1
amp;J2
J5
запускается только после завершения заданияJ4
- Эти два задания (
J3 amp; J5
) должны выполняться в двух разных потоках. 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 — это один блок, и эти блоки нужно выполнять параллельно .. вы намекаете на разветвление?