zoukankan      html  css  js  c++  java
  • 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()先后顺序是否起作用了!

  • 相关阅读:
    【BZOJ3533】向量集(SDOI2014)-线段树+凸壳+二分
    【BZOJ4869】相逢是问候(六省联考2017)-扩展欧拉定理+线段树
    【BZOJ4012】开店(HNOI2015)-动态点分治+set
    【BZOJ1095】捉迷藏(ZJOI2007)-动态点分治+堆
    【BZOJ2299】向量(HAOI2011)-裴蜀定理
    【BZOJ4942】整数(NOI2017)-线段树+压位
    【BZOJ3594】方伯伯的玉米田(SCOI2014)-DP+二维树状数组
    背包DP专题
    【2018.11.7】【luoguNOIp 热身赛】解题报告及总结
    【一天一DP计划】状压DP
  • 原文地址:https://www.cnblogs.com/mistor/p/2490649.html
Copyright © 2011-2022 走看看