1. 程式人生 > >JAVA多執行緒 join() 方法詳解及應用場景

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也是可以實現的。