1. 程式人生 > 其它 >【Java學習筆記(八十二)】之 多執行緒 join方法和ThreadLocal類

【Java學習筆記(八十二)】之 多執行緒 join方法和ThreadLocal類

技術標籤:Java學習筆記# 多執行緒java多執行緒thread

本文章由公號【開發小鴿】釋出!歡迎關注!!!


老規矩–妹妹鎮樓:

一. join()方法

(一) 概述

當主執行緒建立並啟動子執行緒時,如果子執行緒耗時比較長,導致主執行緒在子執行緒之前結束了。如果我們想讓主執行緒在子執行緒之後結束,就需要使用join()方法了,它的作用是等待執行緒物件銷燬。如在主執行緒a中呼叫子執行緒b的start()方法,同時呼叫了b的join()方法,那麼執行緒a就會進入無限期的阻塞中,等待執行緒b執行完畢並銷燬後才能繼續執行執行緒a。

(二) join()與interrupt()

在當前執行緒中呼叫join()方法的過程中,如果當前執行緒物件被中斷,則當前執行緒會出現異常,注意,是當前執行緒哦,不是呼叫join()方法的那個執行緒。即join()與interrupt()方法碰到,會出現異常。


(三) join(long)與Thread.sleep(long)

設定等待時間的join()方法,內部使用wait(long)方法實現的,所以使用join(long)方法具有釋放鎖的特點,只要執行了join(long)方法,就會釋放當前執行緒的鎖,那麼其他執行緒就可以呼叫此執行緒的同步方法了。

而Thread.sleep(long)方法是不釋放鎖的,它會一直持有該執行緒的鎖,直到該執行緒程式碼執行結束才會釋放該執行緒鎖。


(四) join(long)的執行時機

join(long)方法線上程中通常是先執行的,也就是先搶到該執行緒的鎖,但是會快速地釋放掉,來阻塞join(long)方法後該執行緒的程式碼執行。之後,join(long)會和其他執行緒來爭搶該執行緒鎖,誰搶到,誰就先執行。


二. ThreadLocal類

(一) 概述

ThreadLocal類用於每個執行緒私有變數值的共享,它可以讓每個執行緒繫結自己的資料,隔離不同執行緒的資料。

(二) set()和get()

從函式的語義就可以知道,一個是往ThreadLocal類中寫入值,一個是取出值。在不同的執行緒中呼叫這些方法,存入和取出的都是該執行緒的私有資料。


(三) get()的預設值

初次呼叫get()方法時,如果沒有值會返回null,我們可以為ThreadLocal類設定預設值,解決這個問題。通過繼承ThreadLocal類,重寫initialValue()方法,返回預設值。

public class ThreadLocalText extends ThreadLocal{
	@Override
	protected Object initialValue(){
		return “預設值”;
	}	
}

(四) InheritableThreadLocal類

通過類InheritableThreadLocal可以在子執行緒中取得父執行緒繼承下來的值。如建立一個類local來繼承InheritableThreadLocal類,在Main主執行緒中建立local類例項,然後存入一個值,建立一個新的執行緒,並從該執行緒中取出local類例項中的值,發現這兩個值是一致的,說明了父子的繼承關係。

(五) 子執行緒修改父執行緒的值

通過繼承InheritableThreadLocal類,還可以修改父執行緒存入的值,重寫childValue()方法即可,傳入父執行緒的值,返回修改後的值。

@Override
protected Object childValue(Object parentValue){
	return parentValue +123;
}

注意,如果子執行緒在取得值並進行修改的同時,父執行緒將該例項中的值進行了修改,那麼子執行緒獲取到的依然是舊值。