天天看點

線程學習之-合并線程

線程中join方法的意思是把指定的線程加入到目前線程,即将兩個交替執行的線程合并為順序執行的線程。

比如在主線程B中,子線程A調用了join()方法,意思是說直到線程A執行完畢後,線程B才會繼續執行。

同理,如果子線程A調用了join(10)方法,意思是說等線程A執行10毫秒後,線程B才會繼續執行。

另外注意:join方法的調用必須是線上程啟動之後。

分析如下小程式:

package com.ilucky.thread;

/**
 * @author IluckySi
 * @date 2014/01/22
 */
public class Test2 implements Runnable {

	public static int a = 0;
	
	@Override
	public void run() {
		for(int i = 0; i < 100000000; i++) {
			a++;
		}
	}

	public static void main(String[] args) throws InterruptedException {
		Runnable test2 = new Test2();
		Thread t2 = new Thread(test2);
		t2.start();
		//t2.join();
		System.out.println(a);
	}
}
           

在上面的小程式中,如果将代碼t2.join()注釋掉, 輸出結果會是0,為什麼呢? 因為程式一啟動,會在jvm中建立兩個線程:

一個是主線程main,另一個是線程Test2,這兩個線程都是使用者線程,執行互不影響,說是互不影響,其實這裡互不影響的

意思是說這兩個線程是通過搶奪cpu時間片交替執行,是以線程main一啟動,一直搶占着cpu時間片,線程Test2剛被初始化,

還沒來的及搶占cpu時間片,main線程已經執行結束了,是以導緻輸出的結果是0。

相反如果将代碼t2.join()的注釋去掉,執行結果會是100000000,原因就不用多說了。

然後,根據上面說的如果将t2.join()改為t2.join(10),即主線程等待線程Test2執行10毫秒後,主線程再執行,最後輸出的結果

根據電腦自身的性能可能是一個大于0小于等于10000000的數。

最後,還可以通過将t2.join方法放到t2.start方法前面來驗證是不是join方法隻有在啟動線程之後調用有效。

                                                                              天道酬勤,厚德載物。