今天,我們開始Java高併發與多執行緒的第三篇,執行緒的基本屬性和主要方法。
【屬性】
- 編號(ID)
型別long
用於標識不同的執行緒,編號唯一,只存在java虛擬機器的一次執行
- 名稱(Name)
型別String
可以不設定,預設值為Thread-執行緒編號
- 執行緒類別(Daemon)
型別boolean
主要用於區分使用者執行緒和守護執行緒
值為true表示該執行緒為守護執行緒,否則為使用者執行緒
預設值與相應執行緒的父執行緒該屬性值相同,該屬性必須線上程啟動前設定!否則會報錯
-
- 使用者執行緒
使用者行為執行的執行緒;
一個Java虛擬機器,必須等待所有的使用者執行緒結束之後才可以停止執行。
-
- 守護執行緒
通常用於執行一些重要性不是很高的任務,比如監控資源等;
守護執行緒不會影響Java虛擬機器的正常停止。
- 優先順序(Priority)
型別int
該屬性是給執行緒排程器的提示,用於表示應用程式那個執行緒優先執行,但是並不保證真實的執行緒執行順序。
java定義了1~10的10個優先順序別。預設值為5(普通優先順序別)。
對應一個具體的執行緒而言,優先順序別的預設值與父執行緒相同。
注:在JVM中,使用-Xss引數來控制每個執行緒分配的記憶體大小,預設JDK1.4中是256K,JDK1.5+中是1M. |
【常用方法】
- public static native Thread currentThread()
返回當前執行緒,當前程式碼的執行執行緒
- public long getId()
此方法返回執行緒的唯一標識,是一個long型的正數,線上程建立的時候被賦值。
- public final native boolean isAlive()
isAlive方法用於判斷當前執行緒是否處於活動狀態。
什麼是活動狀態呢?
活動狀態就是已經啟動尚未終止的,執行緒處於正在執行或者準備開始執行的狀態就認為執行緒是"活動"的。
(新建狀態的執行緒isAlive()返回的是false)
- public synchronized void start()
啟動執行緒
- public void run()
執行緒的實際執行方法
- public void interrupt ()
interrupt() 中斷執行緒 由執行狀態到死亡狀態。
在Core Java中有這樣一句話:"沒有任何語言方面的需求要求一個被中斷的程式應該終止。中斷一個執行緒只是為了引起該執行緒的注意,被中斷執行緒可以決定如何應對中斷 "。
中斷執行緒操作實質上是修改了一下中斷標示位為true
當前執行緒正在執行,僅僅修改標示位,不再做其他的事
當前執行緒正在阻塞,修改標識位,如果是join,sleep,yield,則會丟擲Interrup異常,修改標示位為false
- public static boolean interrupted()
測試當前執行緒是否已經是中斷狀態,執行後具有清除中斷狀態功能。
- public boolean isInterrupted()
測試執行緒 Thread 物件是否已經是中斷狀態,但不清除中斷狀態標誌。
- public static native void yield()
此方法的作用是放棄當前的CPU資源,將它讓給其他的任務去佔用CPU的時間。但是放棄的時間不確定,有可能剛剛放棄就馬上獲得CPU時間片。
sleep 方法使當前執行中的執行緒睡眠一段時間,進入超時等待狀態,這段時間的長短是由程式設定的,yield方法使當前執行緒讓出CPU佔有權,但讓出的時間是不可設定的。
yield()不會釋放鎖標誌。
yield()只是使當前執行緒重新回到可執行狀態,所以執行yield()的執行緒有可能在進入到可執行狀態後馬上又被執行。
yield()只能使同優先順序或更高優先順序的執行緒有執行的機會。
- public static native void sleep(long millis) throws InterruptedException
sleep 導致當前執行緒休眠;
與 wait 方法不同的是 sleep 不會釋放當前佔有的鎖
sleep(long)會導致執行緒進入 TIMED-WATING狀態,而 wait()方法會導致當前執行緒進入 WATING狀態
可以丟擲中斷異常
Thread.sleep(0)
由於Java採用搶佔式的執行緒排程演算法,因此可能會出現某條執行緒常常獲取到CPU控制權的情況,為了讓某些優先順序比較低的執行緒也能獲取到CPU控制權,可以使用Thread.sleep(0)手動觸發一次作業系統分配時間片的操作,這也是平衡CPU控制權的一種操作。
- void join()
等待相應執行緒結束,若執行緒A呼叫B的join方法,那麼執行緒A會被暫停,直到執行緒B執行結束。
join方法中如果傳入引數,則表示這樣的意思:如果A執行緒中掉用B執行緒的join(10),則表示A執行緒會等待B執行緒執行10毫秒,10毫秒過後,A、B執行緒並行執行。
join(0)等價於join()。
- public final void setPriority(int newPriority)
設定執行緒優先順序
- public final void setDaemon(booleanon)
將執行緒設定為守護執行緒
- public static int activeCount()
程式中活躍的執行緒數
- public static native boolean holdsLock(Object obj)
當前執行緒是否擁有某個具體物件的鎖。
- @Deprecated
public final void stop()
強制停止,已廢棄
可能釋放鎖導致資料不對。
可能導致清理工作做不好。
- suspend和resume
暫停和恢復
同上,已廢棄。
- public final native void wait (longtimeout)
繼承object
呼叫該方法的執行緒進入 WAITING 狀態,只有等待另外執行緒的通知或被中斷才會返回,需要注意的
是呼叫 wait()方法後,會釋放物件的鎖。
因此,wait 方法一般用在同步方法或同步程式碼塊中。
- public final native void notify()
繼承自object
喚醒在此物件監視器上等待的單個執行緒,如果所有執行緒都在此物件上等待,則會選擇喚醒其中一個執行緒,選擇是任意的,並在對實現做出決定時發生,執行緒通過呼叫其中一個wait() 方法,在物件的監視器上等待,直到當前的執行緒放棄此物件上的鎖定,才能繼續執行被喚醒的執行緒,被喚醒的執行緒將以常規方式與在該物件上主動同步的其他所有執行緒進行競爭。
但是要注意,notify不釋放鎖。
類似的方法還有 notifyAll() ,喚醒再次監視器上等待的所有執行緒。
- public final native void notifyAll()
把該物件等待佇列裡面的所有執行緒喚醒,成為可執行執行緒。
本篇比較短,但是因為容易被遺漏掉,所以單獨拿出來講,下一篇我們們講多執行緒裡面的重頭戲------鎖。