2009-12-13 3 views
2

Предположим, что работает нить A. У меня есть другой поток, B, кто нет. B был запущен, находится в состоянии runnable.Общие сведения о соединении()

Что произойдет, если я позвоню: B.join()?

Будет ли он приостановлен с исполнением A или он будет ждать выполнения метода run()?

+1

Можете ли вы представить небольшой пример кода; Я не понимаю ваш вопрос, как написано. Вы звоните B.join() из A? –

ответ

7

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

Итак - Если A запущен, и вы вызываете B.join(), A прекратит выполнение до тех пор, пока B не закончит/не умрет.

+0

Вопрос неясен, и этот ответ столь же смутен. downvoting – dendini

4

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

public class Foo extends Thread { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     System.out.println("Start"); 

     Foo foo = new Foo(); 
     try { 
      // uncomment the following line to start the foo thread. 
      // foo.start(); 
      foo.join(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

     System.out.println("Finish"); 
    } 

    public void run() { 
     System.out.println("Foo.run()"); 
    } 

} 
0

Я думаю, что если A - текущая нитка. Вызов B.join() будет приостановлен до тех пор, пока не закончится метод run(). Это верно?

+0

Да, это ..... – Zaki

0

Какая бы ни была ваша нить, которую вы вызываете B.join(), блокирует и ждет завершения B.

2

Вызов метода соединения в потоке вызывает вызов вызывающего потока для ожидания завершения соединения thread(). Это не влияет на другие потоки, которые не являются вызывающим или вызываемым.

В вашем примере A будет ждать только завершения B, если вы вызываете B.join() из A. Если C вызывает B.join(), выполнение A не изменяется.

3

От http://java.sun.com/docs/books/tutorial/essential/concurrency/join.html

Джойн метод позволяет одному потоку ждать завершения другой. Если т является объектом Thread, чей поток выполняется в данный момент,

t.join(); 

вызывает текущий поток, чтобы приостановить выполнение до нить T, не заканчивается. Перегрузки соединения позволяют программисту указать период ожидания. Тем не менее, как со сном, соединение зависит от ОС для синхронизации, поэтому вы не должны предположить, что соединение будет ждать точно столько же, сколько , сколько вы укажете.

Я могу настоятельно рекомендовать учебник по Java как учебный ресурс.

Смежные вопросы