Многопоточность, задание из учебника

Задание из учебника:

Реализуйте следующие методы:

public static void runTogether(Runnable... tasks)
public static void runlnOrder(Runnable... tasks)

Первый метод должен выполнять каждую задачу в отдельном потоке и возвращать полученный результат, а второй метод — все методы в текущем потоке и возвращать полученный результат по завершении последнего метода.

Реализовал первый метод так:

public static void runTogether(Runnable... tasks) {
    for (Runnable task : tasks) {
        Thread thread = new Thread(task);
        thread.start();
    }
}

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


Ответы (1 шт):

Автор решения: Roman Konoval

Тут проблема в нечетко сформулированном условии задачи, а именно в том, что считать результатом.

Так как используется интерфейс Runnable и метод run возвращает void, то в функциональном смысле - результата нет. Результатом роботы являются побочные эффекты т.е. изменения в статических переменных и взаимодействия с внешним миром (т.е. операции ввода-вывода такие как print или запись в файл или передача данных по сети). Эти побочные эффекты нельзя отложить, точнее нельзя чтобы метод одновременно и выполнялся, но при этом побочные эффекты были отложены.

Кроме того, это учебная задача и тут не может быть таких сложностей.

Условие следует читать и понимать так "второй метод — все методы в текущем потоке и завершать выполнение по завершении последнего метода" и ответ IR42 абсолютно правильный:

for (Runnable task : tasks) task.run()

Upd: действительно перевод неправильный.

and return when the last one has completed.

тут return относится к second method и имеется ввиду, что second method should return, т.е. второй метод должен закончить выполнение.

→ Ссылка