Я прочитал некоторые учебники и даже уже задавал вопрос 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()?
Может кто-нибудь объяснить мои выводы.
Это 'th2.start()' должен быть 'th1.start();', правильно ? То же самое для th/th0. –