Главная » Java » Ожидание завершения работы потока Java

0

Поток способен ждать завершения работы другого потока, используя одну из разновидностей метода join. В простейшем случае предусматривается использование внутреннего бесконечного цикла ожидания. Рассмотрим пример.

class CalcThread extends Thread {

private double result;

public void run() { result = calculate();

            }

public double getResult() { return result;

            }

public double calculate() {

// … Вычислить значение поля result

            }

}

class ShowJoin {

public static void main(String[] args) {

 CalcThread сalc = new CalcThread();

calc.start() ;

dosomethingElse();

 

try { calc.join();

sуstет.оut.println("значение result равно"

+ calc.getResult());

} catch (InterruptedException е) { sуstет.оut. println ("результата нет: работа потока прервана");

}

}

static void dosomethingElse() {

/* … */

}

}

ачала определяется новый производный класс потока, СalcThread, осуществляющий некоторые вычисления. Метод main класса ShowJoin создает и запускает в выполнение экземпляр СalcThread, делает какую-то другую работу )somethingElse), а затем объединяет текущий поток с потоком типа СalcThread. Выход из join определенно означает, что работа метода СalcThread. run завершена и значение result может быть использовано в текущем токе. Если к моменту завершения dosomethingElse поток СalcThread также закончил работу, метод join немедленно возвращает управление. Когда поток по той и иной причине "умирает", соответствующий объект Thread продолжает существование и состояние потока все еще может быть проверено.

В двух других перегруженных вариантах jоin предусматривается задание параметра периода ожидания по аналогии с методами wait. Ниже приведено описание всех трех форм метода join.

public final void join(long millis)

throws InterruptedException

Ожидает завершения выполнения потока или истечения заданного периода времени, выраженного в миллисекундах, в зависимости от того, что произойдет раньше. Нулевое значение параметра означает задание бесконечного промежутка времени. Если работа потока прерывается в момент ожидания, выбрасывается исключение типа InterruptedException.

public final void join(long millis, int nanos)

throws InterruptedException

Более чувствительная версия метода. Величина интервала ожидания складывается из двух составляющих: (выраженной в миллисекундах) и nanos (в наносекундах). Вновь, суммарное нулевое значение параметра, бесконечное ожидание. Величина nanos должна находиться в промежутке 0-999999.

public final void join() throws InterruptedException Метод аналогичен первому варианту при условии join (0).

Если говорить о внутренней реализации join, методы действуют в терминах isАlive и могут быть представлены в виде следующей конструкции:

whi1e (isAlive())

wait();

предположении, что исполняющая система вызывает notifyALL в том случае, :ли выполнение потока прерывается.

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

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