1. 程式人生 > >Java中的執行緒——執行緒中的方法

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是執行緒不安全的

沒想起來的記得回去看看哦~

那麼今天就分享這些了

夥伴們再見了

微信公眾號:javafirst

掃碼關注免費獲取更多資源