java基礎加強_JDK1.5線程併發庫


線程基礎回顧:

多線程_上

多線程_下


Java.lang.concurrent

線程的互斥圖文解說



多個線程訪問共享對象和數據的方式

如果每個線程執行的代碼相同,可以使用同一個Runnable對象,這個Runnable對象中有那個共享數據,例如,買票系統就可以這麼做。

如果每個線程執行的代碼不同,這時候需要用不同的Runnable對象,有如下兩種方式來實現這些Runnable對象之間的數據共享:

  • 將共享數據封裝在另外一個對象中,然後將這個對象逐一傳遞給各個Runnable對象。每個線程對共享數據的操作方法也分配到那個對象身上去完成,這樣容易實現針對該數據進行的各個操作的互斥和通信。

  • 將這些Runnable對象作爲某一個類中的內部類,共享數據作爲這個外部類中的成員變量,每個線程對共享數據的操作方法也分配給外部類,以便實現對共享數據進行的各個操作的互斥和通信,作爲內部類的各個Runnable對象調用外部類的這些方法。

  • 上面兩種方式的組合:將共享數據封裝在另外一個對象中,每個線程對共享數據的操作方法也分配到那個對象身上去完成,對象作爲這個外部類中的成員變量或方法中的局部變量,每個線程的Runnable對象作爲外部類中的成員內部類或局部內部類。
  • 總之,要同步互斥的幾段代碼最好是分別放在幾個獨立的方法中,這些方法再放在同一個類中,這樣比較容易實現它們之間的同步互斥和通信。

  • 極端且簡單的方式,即在任意一個類中定義一個static的變量,這將被所有線程共享。

java5實現的線程池(ExecutorService)

線程池出現的原因:

使用線程池可以有效地控制系統中併發線程的數量,當系統中包含大量併發線程時,會導致系統性能劇烈下降,甚至導致JVM崩潰,而線程池的最大線程數參數可以控制系統中併發線程數不超過此數。

java5新增了一個Executors工廠類來產生線程池,該工廠類包含如下幾個靜態方法來創建線程池:

static ExecutorService newCachedThreadPool() :創建一個具有緩存功能的線程池,系統根據需要創建線程,這些線程將會被緩存在線程池中;

static ExecutorService newFixedThreadPool(int nThreads) :創建一個可重用的、具有固定線程數的線程池。

static ExecutorService newSingleThreadExecutor() :創建一個只有單線程的線程池,他相當於調用newFixedThreadPool()方法時傳入的參數爲1
static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) :創建具有指定線程數的線程池,他可以在指定延遲後執行線程任務。vorePoolSize指池中所保存的線程數,即使線程是空閒的也會被保存在線程池內。

static ScheduledExecutorService newSingleThreadScheduledExecutor() :創建只有一個線程的線程池,他可以在指定延遲後執行線程任務
 
 使用線程池來執行線程任務的步驟如下:

  1. 調用Executors類的靜態工廠方法創建一個ExecutorService對象,該對象代表一個線程池。
  2. 創建Runnable實現類或Callable實現類的實例,作爲線程執行任務。
  3. 調用ExecutorService對象的submit()方法來提交Runnable實例或Callable實例。
  4. 當不想提交任何任務時,調用ExecutorServiec對象的shutdown()方法來關閉線程池。

 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章