在某些情況下,主線程建立並啟動了子線程,如果子線程中需要進行大量的耗時運算,主線程往往將早於子線程結束之前結束,如果主線程想等待子線程執行完畢後,獲得子線程中的處理完的某個資料,就要用到join方法了,方法join()的作用是等待線程對象唄銷毀。
public class Test {public static class MyThread extends Thread {@Overridepublic 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也是可以實現的。