2015-04-26 9 views
2

Вызов для соединения() Гарантируется, что текущий поток прекратит выполнение до тех пор, пока поток, который он соединяет с (другими словами, поток, на который он вызывает join()), завершается.Thread.join не работает

Однако в моей программе оба потока выполняются одновременно. Thread1 не ждет, пока Thread2 завершит выполнение.

Что не так с моей программой?

public class Launcher1 { 


    public static void main(String[] args) { 
     JoinExample runnable=new JoinExample(); 

     Thread thread1=new Thread(runnable); 
     Thread thread2=new Thread(runnable); 

     thread1.start(); 

     try { 
      Thread.sleep(2000); 
     } catch (InterruptedException e1) { 
      e1.printStackTrace(); 
     } 

     thread2.start(); 
     try { 
      thread2.join(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

    } 

} 

public class JoinExample implements Runnable{ 
    public void run(){ 
     for(int i=0;i<10;i++){ 
      System.out.println("i:"+i+" "+Thread.currentThread().getName()); 

      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

} 

Выход:

я: 0 резьбы 0

я: 1 Тема-0

я: 0 Тема-1

я: 2 Резьба-0

я: 1 Тема-1

я: 3 Тема-0

я: 4 Тема-0

я: 2 Тема-1

я: 3 Тема-1

я: 5 тема-0

я: 4 тема-1

я: 6 Тре Свинец-0

я: 7 Тема-0

я: 5 Тема-1

я: 8 Тема-0

я: 6 Тема-1

я: 7 тема-1

я: 9 тема-0

я: 8 тема-1

я: 9 Тема-1

ответ

5

Однако, в моей программе обе нити выполняются одновременно. Thread1 не ждет, пока Thread2 завершит выполнение.

Нет, и это не так - потому что нить 1 не звонит join.Посмотрите на документы вы снова процитировал:

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

Говоря другому: join() метод не заканчивается до тех пор, пока не будет завершена нить, которую он вызвал.

У вас есть три потока в вашей программе - два, которые работают JoinExample.run, и «основная» нить, которая начинается с двух других. Вы говорите, что main нить ждать, пока нить 2 закончится, но это все. Ваши два потока JoinExample полностью независимы.

1

Здесь есть три темы. 1-я нить - основная нить, которая запускает основной метод и порождает 2 дочерних потока. второй нитки - thread1 третий поток - thread2 Когда вы говорите thread2.join(), основной поток блокируется до thread2 отделки, thread1 и thread2 будет продолжать работать.

+0

Спасибо, я ценю это! –

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