在某些情況下,主線程創建並啓動了子線程,如果子線程中需要進行大量的耗時運算,主線程往往將早於子線程結束之前結束,如果主線程想等待子線程執行完畢後,獲得子線程中的處理完的某個數據,就要用到join方法了,方法join()的作用是等待線程對象唄銷燬。
public class Test {
public static class MyThread extends Thread {
@Override
public void run() {
try {
int m = (int) (Math.random() * 10000);
System.out.println("我在子線程中會隨機睡上0-9秒,時間爲="+m);
Thread.sleep(m);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws InterruptedException {
MyThread myThread =new MyThread();
myThread.start();
myThread.join();
System.out.println("正常情況下肯定是我先執行完,但是加入join後,main主線程會等待子線程執行完畢後才執行");
}
}
結果爲:
我在子線程中會隨機睡上0-9秒,時間爲=9566
正常情況下肯定是我先執行完,但是加入join後,main主線程會等待子線程執行完畢後才執行
在主線程中,加入了myThread.join(); 把誰加入了就要等誰。
同時join還有join(millis)方法,可以加入等待時間,效果上類似sleep,但是還是有實際區別的。
join底層是wait方法,所以它是會釋放對象鎖的,而sleep在同步的方法中是不釋放對象鎖的,只有同步方法執行完畢,其他線程纔可以執行。
使用場景
曾經做過一個聯通的增值業務項目,其中有一個業務需要給聯通方暴漏接口,他們調用我們的接口,我們進行業務處理後,再返回結果,接口要求是同步的,實時返回。如果異步的就可以用消息隊列解決了,吧整個業務邏輯中比較費時間的都放在了子線程中運行,子線程跑完後在交由主線程返回結果。當時用的是java中的柵欄 CyclicBarrier ,現在想想用join也是可以實現的。