我阅读了一些教程,甚至已经问过问题here
但我再次对连接方法感到困惑。 我所知道Java在正常情况下无法保证线程的执行顺序。
我使用join()读取的内容,它确保一旦线程调用join,当前线程将不会执行,除非您调用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
为什么两个输出都不同。
我在第1个对象中使用了join()。当th0正在运行并且jvm找到了th1线程所以thread-1应该先完成然后是Thread-0。
为什么它打印Thread-1,Thread-0没有任何顺序。如果输出将是这样的那么join()的用法是什么?
任何人都可以用我的输出来解释。
答案 0 :(得分:1)
这里的问题是两个线程都独立启动并开始打印,th0.start
和th1.start
之间发生的事情不确定。
此外,您的应用程序的主系统线程正在等待以完成th1
,th0
和th1
执行他们的{ {1}}方法彼此独立,这就是每次获得不同序列时的原因。
答案 1 :(得分:0)
请你试试下面的...
try {
th1.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
实际上,通过使用join(10000)方法,我们说要等待另一个线程的10000毫秒...如果其他线程没有在10000毫秒内完成,则开始执行当前线程。
join()的使用没有指定等待其他线程完成执行的时间......