JAVA多線程 join() 方法詳解及應用場景

在某些情況下,主線程創建並啓動了子線程,如果子線程中需要進行大量的耗時運算,主線程往往將早於子線程結束之前結束,如果主線程想等待子線程執行完畢後,獲得子線程中的處理完的某個數據,就要用到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也是可以實現的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章