JAVA多執行緒 join() 方法詳解及應用場景
阿新 • • 發佈:2019-01-07
在某些情況下,主執行緒建立並啟動了子執行緒,如果子執行緒中需要進行大量的耗時運算,主執行緒往往將早於子執行緒結束之前結束,如果主執行緒想等待子執行緒執行完畢後,獲得子執行緒中的處理完的某個資料,就要用到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也是可以實現的。