我阅读了一些教程,甚至已经提出了问题 here
但是我又对 join 方法感到困惑。 我所知道的Java不能保证正常情况下线程的执行顺序。
我使用 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
为什么两个输出不同。
我将 join() 与 th1 对象一起使用。当 th0 正在运行并且 jvm 找到 th1 线程时,所以线程 1 应该先完成,然后是线程 0。
为什么它打印 Thread-1,Thread-0 没有任何顺序。如果输出是这样的,那么 join() 方法有什么用?
谁能用我的输出解释一下。
最佳答案
这里的问题是两个线程独立启动并开始打印内容,th0.start
和 th1.start
之间发生的事情是不确定的。
此外,它是您的应用程序的主系统线程正在等待th1
完成,th0
和th1
彼此独立地执行他们的run
方法,这就是为什么每次你得到一个不同的序列。
关于java - 使用 Join 方法的不同输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30639806/