Java - Тема с использованием службы исполнителя - PullRequest
0 голосов
/ 02 февраля 2020

Я учусь на исполнителя в сервисе java. Требование заключается в использовании службы executor создания 4 потоков -

Поток 1 - получить два числа в качестве входных данных.

Поток 2 - сложение двух чисел

Поток 3 - умножение двух чисел

Поток 4 - вывести результаты.

Поток 1 должен выполняться первым, после завершения потока 1 поток 2, 3 могут начать обработку одновременно и, наконец, после завершения потока 2, 3. Наконец должен выполняться поток 4.

Как мы можем убедиться, какой поток запускается первым, а какие потоки должны запускаться одновременно. Наконец, какой поток, наконец, должен выполняться.

Примечание: как мы можем достичь этого без использования спящего потока. Динамически, как только заканчивается поток 1, остальные два потока должны запускаться автоматически.

Ответы [ 2 ]

2 голосов
/ 02 февраля 2020

Во-первых, прочитайте мой комментарий к вашему первоначальному вопросу - об использовании автомобиля для забивания гвоздей.

Хорошо, теперь у @ dan1st были некоторые идеи о том, как структурировать решение. Вот еще два.

  1. Используйте глобальную переменную int, глобальные lock, wait() и notifyAll(): каждый поток должен ввести блок synchronized(lock), в котором it

    • Циклы, вызывая lock.wait() до тех пор, пока глобальное int не получит какое-то конкретное значение,
    • Делает свое дело,
    • Устанавливает глобальное int в значение, которое будет вызвать следующий поток,
    • , вызовы lock.notify() и, наконец,
    • выход
  2. Использование Semaphores: пройти два Semaphore экземпляры в каждом потоке. Назовите их in и out или несколько таких имен. Пусть каждый поток

    • дождется своей очереди, позвонив in.acquire(),
    • , сделав свое дело,
    • , позвоните out.release(),
    • , а затем exit.

Ваша основная подпрограмма отвечает за создание семафоров и передачу их новым потокам таким образом, что out каждого потока ссылается на один и тот же семафор. как in потока, который, как ожидается, будет выполнять последующее задание.


IMO, вариант 2 более элегантен, потому что, если ваш учитель попросит вас на следующей неделе изменить вашу программу, добавив еще один шаг в середине последовательности, тогда нет существующих задач, которые вы написали, вообще не придется менять. Вам нужно будет только написать новое задание и изменить две или три строки в подпрограмме main ().

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

1 голос
/ 02 февраля 2020

Вы можете сделать это, используя несколько способов.

Например, присоединение :

Поток может присоединиться к другому потоку, что означает, что он ожидает, пока другой поток заканчивается. Поток 2 и 3 могут присоединиться к потоку 1, а поток 4 может присоединиться к потоку 2 и 3.

Другая возможность - await и сигнал , но я не уверен, что она соответствует вашим требованиям (она использует что-то аналогично Thread.sleep():

Сначала вы создаете общий java.util.concurrent.locks.Lock и создаете условие этого замка с помощью .newCondition() Вы также создаете второе условие с помощью newCondition().

Блокировка должна быть заблокирована перед вызовом await и signal / signalAll.

Поток 2 и 3 вызывает .await() при первом условии, а Поток 1 вызывает .signalAll на первом условие, когда он завершается.

Поток 4 вызывает .await() для второго условия перед его началом.

Поток (либо 2, либо 3), который заканчивается последним (logi c, который Поток Первое завершение должно быть синхронизировано с блокировкой) вызовы .signal() при втором условии.

Потоки также могут запускать друг друга :

Поток 1 запускает поток 2 и 3 после того, как его задача заканчивается, но я бы рекомендовал и один из других механизмов для потока 4.

[ ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ ]

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

...