Присоединиться буквально означает присоединение. Давайте посмотрим на объяснение и реализацию метода соединения.
/*** ждет, пока этот поток умрет. * Поток Caller (поток, который вызывает метод соединения) выполняет операцию ожидания до тех пор, пока не заканчивается поток CALD (поток, к которому относится метод соединения), и снова разбудет * <p> Вызов этого метода не будет ведущим текущий поток. * <i> прерванный статус </i> текущего потока * очищается при брошении на это исключение. */ public final void join () бросает прерывание {join (0); }Здесь присоединяется
/** * В ожидании {@code Millis} миллионы второго секунды для этого потока * Die. Тайм -аут {@code 0} означает ждать окончания выполнения потока, или указанное максимальное время ожидания произошло, поток вызывающего абонента снова пробуждается. Если максимальное время ожидания составляет 0, вы можете дождаться завершения выполнения потока, прежде чем проснуться. * <p> В этой реализации используется цикл {@code this.wait} вызовов * обусловлено на {@code this.isalive}. В качестве потока заканчивается метод * {@code this.notifyall}. Рекомендуется, чтобы * Приложения не использовали {@code wat}, {@code notify} или * {@code notifyall} на экземплярах @code}. * * */ public final Synchronized void join (Long Millis) бросает прерывание ExtruptException {long base = System.currentTimeMillis (); долго сейчас = 0; if (millis <0) {бросить новое allosalargumentException («значение тайм -аута отрицательно»); } if (millis == 0) {while (isalive ()) {wat (0); }} else {while (isalive ()) {long Delay = millis - сейчас; if (задержка <= 0) {break; } подождать (задержка); Теперь = System.CurrentTimeMillis () - BASE; }}} Видно, что сам метод соединения реализует, ожидая метода ожидания. Здесь оценивается, что если поток все еще работает, продолжайте ждать. Если указанное время наступило, или поток завершил работу, код продолжает выполняться вниз, и вызововый поток может выполнить последующую логику.
Но здесь я не вижу, куда называть метод уведомления или уведомления. Если это не вызвано, поток абонента будет продолжать ждать. Где метод разбудить его? Благодаря проверке было обнаружено, что когда поток закончился, виртуальная машина Java выполнила локальный метод выхода потока.
// Функция выхода потока: void javathread :: exit (bool destress_vm, exittype exit_type) {... // Это обрабатывает связанное с соединением логики разрушения Блокировка объекта (ThreadObj, Thread); Thread-> clear_pending_exception (); java_lang_thread :: set_thread_status (threadobj (), java_lang_thread :: verminated); java_lang_thread :: set_thread (threadobj (), null); // Здесь мы называем метод notifyall, чтобы разбудить резьбу для ожидания lock.notify_all (thread); Thread-> clear_pending_exception (); }Это поймет, когда поток пробуждается. Давайте напишем пример ниже, чтобы увидеть эффект.
public class совместный {public static void main (string [] args) {threadboy boy = new Threadboy (); Boy.start (); } static class threadboy extends thread {@Override public void run () {System.out.println ("Мальчик и девочка готовы пойти по магазинам"); Threadgirl Girl = new Threadgirl (); Girl.Start (); try {Girl.join (); } catch (прерванное искусство e) {e.printstacktrace (); } System.out.println («Мальчик и девочка начинают делать покупки»); }} static class Threadgirl Extends Thread {@Override public void run () {int time = 5000; System.out.println («Девушка начинает надевать макияж, мальчик ждет ...»); try {thread.sleep (время); } catch (прерванное искусство e) {e.printstacktrace (); } System.out.println («Девушка закончена с макияжем!, Время» + время); }}}} Результат исполнения:
Мальчик и девочка выходят за покупками, и девушка начинает надевать макияж, мальчик ждет. Полем Полем
Макияж девушки закончен! , 5000
Мальчик и девочка начали делать покупки
Мальчик и девочка собираются пойти по магазинам. Девушка должна сначала надеть макияж. После того, как девушка закончила макияж, она пойдет по магазинам вместе.
Так в чем же использование присоединения (время)?
public class совместный {public static void main (string [] args) {threadboy boy = new Threadboy (); Boy.start (); } static class threadboy extends thread {@Override public void run () {System.out.println ("Мальчик и девочка готовы пойти по магазинам"); Threadgirl Girl = new Threadgirl (); Girl.Start (); Int Time = 2000; попробуй {girl.join (время); } catch (прерванное искусство e) {e.printstacktrace (); } System.out.println («мальчик ждал» + время + », я не хочу больше ждать, я иду по магазинам»); }} static class Threadgirl Extends Thread {@Override public void run () {int time = 5000; System.out.println («Девушка начала надевать макияж, мальчик ждал ...»); try {thread.sleep (время); } catch (прерванное искусство e) {e.printstacktrace (); } System.out.println ("Девушка закончила подготовку!, Время взято" + время); }}} Здесь метод соединения заменяется только методом соединения (время). Описание было изменено, и результат печати:
Мальчик и девочка выходят за покупками, и девушка начинает надевать макияж, мальчик ждет. Полем Полем
Мальчик ждал 2000 и не хотел больше ждать. Он пошел по магазинам, и девушка закончила надеть макияж! , 5000
Мальчик ждал времени в присоединении (время). Если нить, в которой находилась девушка, не была выполнена после этого времени, он больше не будет ждать и продолжать выполнять последующую логику, просто чтобы пойти по магазинам самостоятельно, не ожидая девушки.
Из этого мы видим, что метод соединения состоит в том, чтобы достичь более удобного выполнения двух потоков. Поток 1 выполняется. После встречи с потоком 2 дождитесь выполнения потока 2, а затем продолжайте выполнять выполнение потока 1. Значение присоединения теперь более визуально.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.