我有以下代码
class Multi extends Thread{
public void run(){
for(int i=1;i<=3;i++){
System.out.println(i + ": "+Thread.currentThread().getName());
}
}
public static void main(String args[]){
Multi t1=new Multi();
t1.setName("First Thread");
Multi t2=new Multi();
t2.setName("Second Thread");
Multi t3=new Multi();
t3.setName("Third Thread");
t1.start();
t2.start();
try{
t1.join();
t2.join();
}catch(Exception e){System.out.println(e);}
t3.start();
}
}**
每次运行以下命令时,输出都会有所不同:
1st time Output
1: Second Thread
2: Second Thread
3: Second Thread
1: First Thread
2: First Thread
3: First Thread
1: Third Thread
2: Third Thread
3: Third Thread
=============================================
2nd time Output
1: First Thread
2: First Thread
3: First Thread
1: Second Thread
2: Second Thread
3: Second Thread
1: Third Thread
2: Third Thread
3: Third Thread
*************************************************既然t2.join()是在t1.join()之后调用的,那么第一个输出是怎么来的?t2不应该等待t1执行吗?
如果可能的话,请用更多的代码片段示例帮助我理解join()方法的行为
发布于 2013-12-12 01:05:17
在线程t完成执行之前,t.join()会阻塞当前线程(示例中的主线程)。它不会阻塞任何其他线程,也不会阻止任何其他线程运行。
您的示例启动t1和t2。所以t1和t2是并行运行的。并且主线程会阻塞,直到t1完成。一旦t1完成,它就会阻塞,直到t2完成。在t1之前,t2很可能已经完成了执行。在这种情况下,t2.join()将立即返回。
发布于 2013-12-12 01:05:31
join method不会影响任何当前正在执行的Thread的执行顺序,它所做的一切都是让当前线程等待,直到指定的Thread结束。
发布于 2013-12-12 01:06:18
让线程t2等待t1完成..您需要在t2的run()方法中编写t1.join()。
在本例中,主线程将等待t1和t2完成,然后启动线程t3。从输出中可以明显看出,t3是在t1和t2完成之后启动的。
https://stackoverflow.com/questions/20525328
复制相似问题