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()先后順序是否起作用了!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM