Thread.join()在start()的前后顺序分析

     在多线程中往往用到join()的方法,join()是什么呢?

     Thread类的Join()措施能够将两个交替厉行的线程并合为次序厉行的线程。例如在线程B中调用了线程A的Join()措施,线程A将插入线程B之前,直到线程A厉行告终后,才会继续厉行线程B。

    代码如下:

   

package com.cn.process;

public class test {

	/**
	 * @param args
	 */
		
   public class hello implements Runnable
	{

		@Override
		public void run() {
			// TODO Auto-generated method stub
			 for (int i = 0; i < 3; i++) 
			 { 
                                                          System.out.println(Thread.currentThread().getName()+i);            
			 }
     
 }
		
		
	}
	
	public static void main(String[] args) throws InterruptedException {
		String threadName = Thread.currentThread().getName();    
		test test=new test();
		hello he=test.new hello();
		
		Thread demo = new Thread(he,"线程");//第二个参数是线程名称(自定义)           
		demo.start();//调用start方法但是调用该方法只是准备线程并不是马上启动
		demo.join(); //强制执行demo,只有当demo线程执行结束之后主线程才能继续当前主线程执行--相当于在主线程中添加了demo的子线程, 使异步执行线程转为同步执行
		//demo.start();//join()方法在start()前后显示的结果明显的不一样  可以证明只有当start()启动后 才能正确执行join() 
		for(int i=0;i<50;++i)
		{     
                    System.out.println(threadName +"线程执行-->"+i);           
                 }         
}

}  

  执行的结果是:

线程0
线程1
线程2
main线程执行-->0
main线程执行-->1
main线程执行-->2
main线程执行-->3
main线程执行-->4
main线程执行-->5
main线程执行-->6
main线程执行-->7
main线程执行-->8
main线程执行-->9
main线程执行-->10
main线程执行-->11
main线程执行-->12
main线程执行-->13
main线程执行-->14
main线程执行-->15
main线程执行-->16
main线程执行-->17
main线程执行-->18
main线程执行-->19
main线程执行-->20
main线程执行-->21
main线程执行-->22
main线程执行-->23
main线程执行-->24
main线程执行-->25
main线程执行-->26
main线程执行-->27
main线程执行-->28
main线程执行-->29
main线程执行-->30
main线程执行-->31
main线程执行-->32
main线程执行-->33
main线程执行-->34
main线程执行-->35
main线程执行-->36
main线程执行-->37
main线程执行-->38
main线程执行-->39
main线程执行-->40
main线程执行-->41
main线程执行-->42
main线程执行-->43
main线程执行-->44
main线程执行-->45
main线程执行-->46
main线程执行-->47
main线程执行-->48
main线程执行-->49

ok  成功  起到了join的作用!

当我注释掉前面的start()的时候,

以下是代码片段:

//demo.start();//调用start方法但是调用该方法只是准备线程并不是马上启动
demo.join(); //强制执行demo,只有当demo线程执行结束之后主线程才能继续当前主线程执行--相当于在主线程中添加了demo的子线程, 使异步执行线程转为同步执行
 demo.start();//join()方法在start()前后显示的结果明显的不一样  可以证明只有当start()启动后 才能执行join() 也就是说 当join()在前面的话就失去了意义

执行结果可能是(cpu有关):

线程0
main线程执行-->0
main线程执行-->1
main线程执行-->2
main线程执行-->3
main线程执行-->4
main线程执行-->5
main线程执行-->6
main线程执行-->7
main线程执行-->8
main线程执行-->9
线程1
线程2
main线程执行-->10
main线程执行-->11
main线程执行-->12
main线程执行-->13
main线程执行-->14
main线程执行-->15
main线程执行-->16
main线程执行-->17
main线程执行-->18
main线程执行-->19
main线程执行-->20
main线程执行-->21
main线程执行-->22
main线程执行-->23
main线程执行-->24
main线程执行-->25
main线程执行-->26
main线程执行-->27
main线程执行-->28
main线程执行-->29
main线程执行-->30
main线程执行-->31
main线程执行-->32
main线程执行-->33
main线程执行-->34
main线程执行-->35
main线程执行-->36
main线程执行-->37
main线程执行-->38
main线程执行-->39
main线程执行-->40
main线程执行-->41
main线程执行-->42
main线程执行-->43
main线程执行-->44
main线程执行-->45
main线程执行-->46
main线程执行-->47
main线程执行-->48
main线程执行-->49

这就可以看出了 join()先后顺序是否起作用了!

原文地址:https://www.cnblogs.com/mistor/p/2490649.html