Подтвердить что ты не робот

Почему мы должны использовать Join in threads?

У меня есть 2 потока T1 и T2, у обоих есть разные задания, поэтому обычно мы предпочитаем выполнять эту задачу по потоку Joins.

Но мы можем сделать это без использования join(). Мы можем добавить код потока T2 внутри потока T1. Какая разница?

4b9b3361

Ответ 1

Основное различие заключается в том, что когда мы присоединяемся к потоку T2 с T1, время T2, выполняющее задание, также может использоваться T1, это означает, что они будут выполнять разные задания. Но это не может произойти, когда вы включаете поток T2 код внутри потока T1.

Ответ 2

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

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

Если вы разделите задание на две части, которые выполняются разными потоками, вы можете повысить производительность, если

  • потоки могут выполняться независимо друг от друга, то есть если они не полагаются друг на друга, в противном случае вам нужно будет синхронизировать стоимость затрат
  • JVM может выполнять несколько потоков параллельно, т.е. у вас есть гиперпотоковая/многоядерная машина, а JVM использует это

Ответ 3

обычно мы предпочитаем выполнять эту задачу с помощью объединения потоков.

Нет, мы этого не делаем. Мы выполняем эту задачу, запустив два потока. Нет никакого обязательства использовать join(), чтобы в нем не было необходимости. Если вы хотите приостановить текущий поток, пока выполняется другой поток, сделайте это. Если вы этого не сделаете, не делайте этого.

Ответ 4

Если вы вызываете T1.join(); из T2, он будет ждать, пока T1 умрет (закончите). Это форма синхронизации потоков, но из того, что вы описываете, вы можете просто запустить два потока и просто не использовать join. Если вы используете два потока, то работа будет выполняться параллельно, если вы поместите код только в один поток, то работа будет выполнена последовательно.

Ответ 5

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

Пример1: После того, как пользователь нажал кнопку отправки, программа должна вызвать два внешних веб-сервиса для обновления своих соответствующих систем. Это можно сделать одновременно, поэтому мы создадим отдельный поток для одного из веб-сервисов.

Пользователь будет сидеть перед экраном и ждать уведомления: ваше сообщение в порядке! Экран должен сказать "ОК" только после завершения обоих потоков.

Ответ 6

Две вещи.

Присоединение используется только тогда, когда один поток должен ждать завершения открытия (скажем, поток A готовит файл, и поток B не может продолжаться, пока файл не будет готов). Есть экземпляр, где потоки независимы и не требуется соединение (например, большинство потоков демона).

С помощью потоковой передачи вы получаете несколько вещей: - главным образом, независимость в порядке исполнения. Допустим, у вас есть программа, которая, когда вы нажимаете кнопку, выполняет некоторую тяжелую обработку. Если вы выполните эту обработку в основном потоке, вы закроете GUI, пока задача не будет завершена. Если вы выполняете обработку в другом потоке, тогда поток GUI "освобождается", и графический интерфейс продолжает работать. - в некоторых (большинстве) современных компьютеров создание нескольких потоков может позволить ОС использовать разные ядра для обслуживания различных потоков, повышая производительность.

Недостатком является большая сложность, так как вам нужна информация о состоянии выполнения других потоков.

Ответ 7

Вы можете использовать что-то вроде java.util.concurrent.CountDownLatch, например:

CountDownLatch doneSignal = new CountDownLatch(2);

и каждый поток countDown(), когда они сделаны, поэтому основной поток знает, когда оба потока завершены.

Ответ 8

используя Join, так же, как мы можем добавить код потока T2 внутри потока T1

join(), как и имя метода, означает, что поток умирает и присоединяется к нему в конце выполнения. Вы можете добавить один код потока внутри другого, но это уничтожит цель использования двух отдельных потоков для одновременной работы ваших заданий. Помещение одного кода за другим будет выполнять ваши операторы в последовательности. Нет concurrency.

Если вы сомневаетесь, обратитесь к javadocs - http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.html#join%28%29

Ответ 9

Если T1 и T2 выполняют разные задачи, которые не зависят от изменений состояния, вызванных друг другом, вы не должны присоединяться к ним, чтобы воспользоваться преимуществами параллельного выполнения. В случае наличия зависимостей состояний вы должны синхронизировать оба потока с помощью таких механизмов, как wait/notify или даже .Join() в зависимости от вашего варианта использования.

А что касается сочетания методов run() обоих потоков, он полностью остался для вас. Я имею в виду, вы должны понимать, почему оба потока имеют разные "типы" (поскольку они имеют другое тело run()) в первую очередь. Это аспект дизайна, а не аспект производительности.