Java中的執行緒——執行緒中的方法
上次說了實現多執行緒的兩種方式
今天來了解一下執行緒中的方法
多執行緒裡面的方法
獲取名字和設定名字
1)獲取名字
通過getName()方法獲取執行緒物件的名字
預設是0、1、2...這樣來給執行緒命名的~
2)設定名字
a.通過建構函式可以傳入 String 型別的名字
b.通過setName()方法來設定執行緒名稱
獲取當前執行緒的物件
通過Thread.currentThread() 方法獲取執行緒的物件
主執行緒也可以獲取
休眠執行緒
Thread.sleep(毫秒,納秒), 控制當前執行緒休眠若干毫秒,
1秒= 1000毫秒 ,1秒 = 1000 * 1000 * 1000納秒
守護執行緒
setDaemon()
設定一個執行緒為守護執行緒, 該執行緒不會單獨執行, 當其他非守護執行緒都執行結束後, 自動退出。
就好像我們玩遊戲的時候,英雄就是守護水晶塔的,當把水晶推掉的時候,遊戲就結束了,英雄的守護任務就結束了,不動了~
下面我們用程式碼來演示一下
t2 是守護執行緒,在 t1 執行緒結束之後,沒有立即結束,還運行了一段~這個原因就是一個時間的緩衝, t2執行緒 收到 t1執行緒 結束的資訊需要一定的時間,這段時間 t2就會執行一段時間。
等待執行緒
join()
當前執行緒暫停, 等待指定的執行緒執行結束後, 當前執行緒再繼續
join(int)
當前執行緒暫停,等待指定的毫秒數之後,當前執行緒會繼續執行
禮讓執行緒
yield()
讓出cpu~
這個方法的效果不是明顯:
就比如我們一群人去搶票,我搶到了票(cpu),然後我禮讓一下,執行yield()方法,把票讓出去~然後還是大家一起來搶票,這一次就可能還是我搶到了票。但是我已經執行了一次禮讓的操作了~
設定執行緒的優先順序
setPriority()
設定執行緒的優先順序
同步程式碼塊
1)什麼情況下需要同步?
當多執行緒併發, 有多段程式碼同時執行時, 我們希望某一段程式碼執行的過程中CPU不要切換到其他執行緒工作. 這時就需要同步.
如果兩段程式碼是同步的, 那麼同一時間只能執行一段, 在一段程式碼沒執行結束之前, 不會執行另外一段程式碼.
2)同步程式碼塊
使用synchronized關鍵字加上一個鎖物件來定義一段程式碼, 這就叫同步程式碼塊
多個同步程式碼塊如果使用相同的鎖物件, 那麼他們就是同步的
造成這個問題的原因就是執行緒1沒有執行完,執行緒2就把資源搶過去了~
現在我們來給資源加鎖,注意:
鎖物件可以是任意物件,但是被鎖的程式碼需要保證是同一把鎖,不能用匿名物件
同步方法
使用synchronized關鍵字修飾一個方法, 該方法中所有的程式碼都是同步的
非靜態同步方法的鎖是:this
這段程式碼用來驗證
非靜態的同步方法的鎖物件是this
靜態的同步函式的鎖是:位元組碼物件
這段程式碼用來驗證
非靜態的同步方法的鎖物件是位元組碼物件
執行緒安全問題
多執行緒併發操作同一資料時, 就有可能出現執行緒安全問題。使用同步技術可以解決這種問題, 把操作資料的程式碼進行同步, 不要多個執行緒一起操作。
模擬火車站賣票的執行緒
一張票被賣了四次顯然是不對的
下面我們用來修改上面的程式碼:
1)給總票數100新增一個static,表示100張票所有執行緒物件共享的資源。
2)當多執行緒一起協作修改同一個資料(ticket)時要使用同步鎖。
用實現Runnable介面的方式實現上面的賣票例子
1)這裡面的ticket就不用加static,因為我們只有一個執行緒物件,實現了資源共享。
2)這裡面的鎖物件用this和位元組碼物件都是可以的
死鎖
多執行緒同步的時候, 如果同步程式碼巢狀, 使用相同鎖, 就有可能出現死鎖
儘量不要巢狀使用
這樣就是陷入死鎖了
回顧有關執行緒安全的問題
咱們之前有說過一些方法的區別,是在於執行緒安全的問題上,我們來回顧一下:
StringBuffer是執行緒安全的
StringBuilder是執行緒不安全的
Vector是執行緒安全的
ArrayList是執行緒不安全的
Hashtable是執行緒安全的
HashMap是執行緒不安全的
沒想起來的記得回去看看哦~
那麼今天就分享這些了
夥伴們再見了