[seriesposts sid=500]
線程的join合併的含義就是將幾個並行線程的線程合併爲一個單線程執行,應用場景是當一個線程必須等待另外一個線程執行完畢才能執行時可使用join方法。 java
package com.javaer.thread; public class Tjoin { /** * @param args */ public static void main(String[] args) { Thread t = new Thread(new Runner()); t.start(); try { t.join(1000); System.out.println("join ok"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } class Runner implements Runnable { @Override public void run() { try { System.out.println("Start sleep"); Thread.sleep(1000); System.out.println("End sleep"); } catch (InterruptedException e) { e.printStackTrace(); } } }
Start sleep
join ok
End sleep
主線程等待1000ms,進行合併,跳回主線程,而後執行子線程
若是將 android
t.join(1000);
改成 面試
t.join(2000);
主線程等待2000ms,進行合併。
結果 編程
Start sleep
End sleep
join ok
主線程等2000,開始join。 跳回主線程,發現子線程都執行完畢了。
若是改爲多線程
t.join(0)
JDK這樣說的 A timeout of 0 means to wait forever 字面意思是永遠等待.
結果 ide
Start sleep
End sleep
join ok
其實Join方法實現是經過wait。 當main線程調用t.join時候,main線程會得到線程對象t的鎖(wait 意味着拿到該對象的鎖),調用該對象的wait(等待時間),直到該對象喚醒main線程,好比退出後。
因此上面的t.join(0) 等到子線程退出之後,跳回主線程。
main 線程調用t.join時,必須可以拿到線程t對象的鎖,若是拿不到它是沒法wait的,剛開的例子t.join(1000)不是說明了main線程等待1秒,若是在它等待以前,其餘線程獲取了t對象的鎖,它等待時間可不就是1秒了
post
package com.javaer.thread;
public class Tjoin {
/**
* @param args
*/
public static void main(String[] args) {
Thread t = new Thread(new Runner());
new Threader(t).start();
t.start();
try {
t.join(1000);
System.out.println("join ok");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class Threader extends Thread {
Thread thread;
public Threader(Thread thread) {
this.thread = thread;
}
@Override
public void run() {
holdThreadLock();
}
public void holdThreadLock() {
synchronized (thread) {
System.out.println("獲取一個鎖");
try {
Thread.sleep(9000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
System.out.println("釋放鎖");
}
}
}
class Runner implements Runnable {
@Override
public void run() {
try {
System.out.println("Start sleep");
Thread.sleep(2000);
System.out.println("End sleep");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
獲取一個鎖
Start sleep
End sleep
釋放鎖
join ok
一個線程獲取了鎖,主線在join的時候,即便被join的線程結束了,由於線程被鎖住,因此即便join的時間也到了,可是仍是必須等待鎖釋放,才能被join
首發於http://java-er.com - http://java-er.com/blog/java-thread-join/
看了不後悔,學習編程的八個建議
你會遇到的30個JAVA面試題
俄羅斯方塊設計原理
Android教程二:Android 工程文件說明大全
java高性能編程的26個注意事項
一位外國網賺達人的五個寫博客建議性能