1. 程式人生 > >Java中的執行緒之執行緒間的通訊

Java中的執行緒之執行緒間的通訊

                                         兩個執行緒間的通訊

這是我們的執行緒:

執行效果:誰搶到資源,誰執行~

實現執行緒交替執行:

這裡主要用到了兩個內容

1)建立一個標記 flag,讓程式進行判斷:

當flag != 1 時,print1 進入等待,執行 print2,然後讓 flag=1,喚醒正在等待·的執行緒,

當flag != 0 時,print2 進入等待,執行 print1 ,讓後讓 flag=0,喚醒正在等待的執行緒。

2)在 object 類中有 wait() 和 notify() 方法,可以對執行緒進行等待和喚醒的操作

                                                  多個執行緒間的通訊

這個時候用 notify() 方法就不夠了,這個方法只能喚醒單個的執行緒,要用notifyAll,喚醒所有正在等待的執行緒,然後讓他們自行匹配,誰滿足條件誰就執行~

注意:

在同步程式碼塊中,用哪個物件鎖,就用那個物件呼叫 wait() 方法。

                                            sleep() 和 wait() 方法的區別

這兩個方法的功能很像,但是還是有一點區別的~

第一點:

sleep()方法必須給一個引數,引數就是等待的時間,時間到了自動醒來。

wait()方法也可以傳入引數,程式在引數代表的時間結束後進入等待,不傳引數表示程式直接進入等待。

第二點:

sleep()方法在同步程式碼塊或同步函式中,不釋放鎖。

wait()方法在同步程式碼塊或同步函式中,釋放鎖。

                                                   JDK1.5的特性

互斥鎖 ReentrantLock

一個可重入的互斥鎖 Lock,它具有與使用 synchronized 方法和語句所訪問的隱式監視器鎖相同的一些基本行為和語義,但功能更強大。 

這裡面有一個 newCondition()方法 

可以返回一個 Condition 例項。 這個例項可以呼叫下面的方法,我們主要用到了圈起的兩個方法~

那麼我們實現上面的功能的程式碼,就可以這樣來寫

                                                          執行緒的生命週期

就是一個執行緒的生命週期,如下圖:

                                                      執行緒組

執行緒組概述

Java 中使用 ThreadGroup 來表示執行緒組,它可以對一批執行緒進行分類管理,Java 允許程式直接對執行緒組進行控制。

預設情況下,所有的執行緒都屬於主執行緒組。

getThreadGroup()

通過執行緒物件獲取他所屬於的組

getName()

通過執行緒組物件獲取他組的名字

我們也可以給執行緒設定分組

步驟如下:

1)ThreadGroup(String name) 建立執行緒組物件並給其賦值名字

2)建立執行緒物件

3)Thread(ThreadGroup, Runnable,name) 

4)設定整組的優先順序或者守護執行緒

程式碼演示:

                                                            執行緒池

程式啟動一個新執行緒成本是比較高的,因為它涉及到要與作業系統進行互動。而使用執行緒池可以很好的提高效能,尤其是當程式中要建立大量生存期很短的執行緒時,更應該考慮使用執行緒池。

執行緒池裡的每一個執行緒程式碼結束後,並不會死亡,而是再次回到執行緒池中成為空閒狀態,等待下一個物件來使用。(從JDK5開始,Java內建支援執行緒池)

內建執行緒池的使用概述

JDK5新增了一個Executors工廠類來產生執行緒池,有如下幾個方法

newFixedThreadPool(int nThreads)

newSingleThreadExecutor()

這些方法的返回值是 ExecutorService 物件,該物件表示一個執行緒池,可以執行 Runnable 物件或者 Callable 物件代表的執行緒。它提供瞭如下方法

submit(Runnable task)

submit(Callable<T> task)

使用步驟:

1)建立執行緒池物件

2)建立Runnable例項

3)提交Runnable例項

4)關閉執行緒池

程式碼演示: