Содержание, связанное с этой главой, включает в себя:
1. join () введение
2. join () Анализ исходного кода (на основе JDK1.7.0_40)
3. join () Пример
1. join () введение
join () определяется в Thread.java.
Роль join (): пусть «главная нить» подождите, пока «детская нить» закончится, прежде чем продолжить работу. Это предложение может быть немного неясным, но мы должны понимать его с помощью примеров:
Кода -копия выглядит следующим образом:
// Основная поток
Отец открытого класса расширяет тему {
public void run () {
Сын S = новый сын ();
S.Start ();
s.join ();
...
}
}
// детская нить
Son Public Class Son расширяет Thread {
public void run () {
...
}
}
иллюстрировать:
Выше приведены два класса Отец (основной класс потока) и Сон (класс подборов). Поскольку сын создан и начинается в отце, отец является основным классом темы, а сын - класс детской нити.
В главной ветке отца создайте новую «детскую нить S» через New Son (). Затем запустите «Детская ветка S» через S.Start () и вызовите S.Join (). После вызова S.Join (), главная нить отца будет ждать, пока «детская нить S» не будет завершена; Это то, что мы называем «Роль join (), чтобы заставить основной поток подождать, пока детский поток закончится, прежде чем он может продолжать работать»!
2. join () Анализ исходного кода (на основе JDK1.7.0_40)
Кода -копия выглядит следующим образом:
public final void join () бросает прерывание
join (0);
}
Общественное окончательное синхронизированное void gin (Long Millis)
бросает прерывание
Long Base = System.CurrentTimeMillis ();
долго сейчас = 0;
if (millis <0) {
бросить новое allosalargumentException («значение тайм -аута отрицательно»);
}
if (millis == 0) {
while (isalive ()) {
Подождите (0);
}
} еще {
while (isalive ()) {
длинная задержка = миллисы - сейчас;
if (задержка <= 0) {
перерыв;
}
Подождите (задержка);
Теперь = System.CurrentTimeMillis () - BASE;
}
}
}
иллюстрировать:
Из кода мы можем найти его. Когда Millis == 0 он входит в петлю (Isalive ());
Мы понимаем использование join () на основе приведенного выше кода при объяснении роли join ()!
вопрос:
Хотя место, где называется S.Join (), встречается в «Основной нити отца», S.Join () называется join () через «детская нить S». Затем, iSalive () в методе join () должен определить, является ли «дочерняя нить S» живым состоянием; Но если это так, то, как может быть функция s.join () «пусть основной поток подождать, пока не завершится детская нить», это должно быть, чтобы дочерняя нить ожидала (потому что метод ожидания детской потока. Объект S называется хорошо) "?
Ответ: Функция wait () состоит в том, чтобы сделать «текущий поток» ждать, а «текущий поток» здесь относится к потоке, работающему в настоящее время на процессоре. Поэтому, хотя метод wait () детской нити называется, он вызывается через «Главный поток»;
3. join () Пример
После понимания роли join (), давайте проверим использование join () с помощью примеров.
Кода -копия выглядит следующим образом:
// совместный код.
открытый класс совместный {
public static void main (string [] args) {
пытаться {
Threada T1 = New Threada ("T1");
t1.start ();
t1.join ();
System.out.printf («%s finish/n», Thread.currentThread (). GetName ());
} catch (прерванная экспрессия e) {
e.printstacktrace ();
}
}
Static Class Threada Extends Thread {
public Threada (String name) {
супер (имя);
}
public void run () {
System.out.printf ("%s start/n", this.getName ());
// операция задержки
для (int i = 0; i <1000000; i ++)
;
System.out.printf ("%s finish/n", this.getName ());
}
}
}
Результаты работы:
Кода -копия выглядит следующим образом:
T1 Start
T1 финиш
Главная отделка
Результаты Описание:
Процесс работы показан на рисунке
(01) Создайте новый «Thread T1» в «Main Thread Main» через New Threada («T1»). Затем запустите «Поток T1» через t1.start () и выполните t1.join ().
(02) После выполнения t1.join () «Главный майн потока» войдет в «состояние блокировки» и ждать конца пробега T1. После того, как «детская нить T1» будет завершена, будет пробуждена «основная нить», а «основная нить» восстановит права на выполнение ЦП и продолжит работать.