2015-06-04 1 views
2

Я прочитал некоторые учебники и даже уже задавал вопрос hereDifferent Вывод с методом регистрации

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

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

Мой пример, который я попытался

public class ThreadTest1 extends Thread{ 

    @Override 
    public void run() { 
     super.run(); 
     for(int i=0; i<10; i++) 
     { 
      System.out.println(i + " :"+ Thread.currentThread().getName()); 
     } 
    } 

    public static void main(String[] args) { 

     System.out.println("Thread is getting started"); 
     ThreadTest1 th0= new ThreadTest1(); 
     th0.start(); 
     ThreadTest1 th1= new ThreadTest1(); 
     th1.start(); 
     try { 
      th1.join(10000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

} 

Выходы:

First time output 
0 :Thread-1 
1 :Thread-1 
2 :Thread-1 
0 :Thread-0 
3 :Thread-1 
1 :Thread-0 
4 :Thread-1 
2 :Thread-0 
5 :Thread-1 
3 :Thread-0 
6 :Thread-1 
4 :Thread-0 
7 :Thread-1 
8 :Thread-1 
9 :Thread-1 
5 :Thread-0 
6 :Thread-0 
7 :Thread-0 
8 :Thread-0 
9 :Thread-0 
Second time output: 
0 :Thread-1 
0 :Thread-0 
1 :Thread-1 
1 :Thread-0 
2 :Thread-1 
2 :Thread-0 
3 :Thread-1 
3 :Thread-0 
4 :Thread-1 
4 :Thread-0 
5 :Thread-1 
5 :Thread-0 
6 :Thread-1 
6 :Thread-0 
7 :Thread-1 
7 :Thread-0 
8 :Thread-1 
8 :Thread-0 
9 :Thread-1 
9 :Thread-0 

Почему оба выхода различны.

Я использовал join() с объектом th1. когда th0 запущен, а jvm найден th1-нить Итак, поток-1 должен быть закончен сначала, чем Thread-0.

Почему его печать Thread-1, Thread-0 без какой-либо последовательности. Если выходы будут такими, то какой смысл использовать join()?

Может кто-нибудь объяснить мои выводы.

+0

Это 'th2.start()' должен быть 'th1.start();', правильно ? То же самое для th/th0. –

ответ

1

Проблема в том, что обе нити начинаются независимо и начинают печатать материал, что происходит между th0.start и th1.start не является детерминированным.

Кроме того, это основная система Нить приложения, которое ждет для th1, чтобы закончить, th0 и th1выполнить их run метод независимо друг от друга, поэтому каждый раз, когда вы получите последовательность Differente.

0

пожалуйста, вы можете попробовать, используя ниже ...

try { 
     th1.join(); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

На самом деле, используя присоединиться (10000) метод мы говорим ждать atmost 10000ms для другого потока ... если другой поток не закончил в течение 10000 мс начинается выполнение текущего потока.

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

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