15
Design Pattern - Multi Thread - 2014/09/12 Winston Hsieh

Design Pattern - Multi Thread

Embed Size (px)

Citation preview

Design Pattern - Multi Thread -

2014/09/12Winston Hsieh

Outline

Thread Pool Future Mode Read-Write-Lock Mode Two-phase Termination Mode

2

Thread Pool Mode

Thread pool 模式的概念就是,需要使用執行緒時,在一個執行緒池中尋找可用的執行緒

如果找不到再建立新的,執行緒使用完畢後,留在池中重複使用 若能重複使用所建立的執行緒,而不是用完就丟,可以有效的重

複利用資源

3

Future Mode (1)

考慮這樣一個情況,使用者可能快速翻頁瀏覽文件中,而圖片檔案很大,如此在瀏覽到有圖片的頁數時,就會導致圖片的載入,因而造成使用者瀏覽文件時會有停頓的現象

所以我們希望在文件開啟之後,仍有一個背景作業持續載入圖片,如此使用者在快速瀏覽頁面時,所造成的停頓可以獲得改善。

4

Future Mode

在請求發生時,會先產生一個 Future 物件給發出請求的客戶

5

Future Mode

而同時間,真正的目標物件之生成,由一個 新的執行緒持續進行(即 Worker Thread ),真正的目標物件生成之後,將之設定至Future 之中

6

Future Mode

而當客戶端真正需要目標物件時, 目標物件也已經準備好,可以讓客戶提取使用

7

Read-Write-Lock Mode (1)

被讀取或寫入的資料一個鎖定物件,在讀取或寫入時要向鎖定物件形式上讀取鎖定,實際上真正是否鎖定共用資源,由鎖定物件來判斷。

8

public void readData() { lock.readLock(); doRead(); lock.readUnLock(); }

public void writeData() { lock.writeLock(); doWrite(); lock.writeUnLock(); }

Read-Write-Lock Mode (2) 9

讀取者讀取資料時的 Sequence Diagram

Read-Write-Lock Mode (3) 如果可以同時讀取,現在假設有個讀取者已經取得鎖,另一個讀

取者其實也還是可以如下形式上取得鎖定並讀取

10

Read-Write-Lock Mode (4) 如果現在只剩一個讀取者,而寫入者試圖進行寫入,它也試圖先

取得鎖定,但發現鎖已經被讀取的一方擁有,於是先進入等待,直到讀取的一方解除鎖定為止。

11

Read-Write-Lock Mode (5) writerFirst 是寫入優先的旗標,它確保只要有寫入的執行緒在等

待時,在解除鎖定的時候,可以優先由寫入執行緒取得鎖定,以確保讀取者讀取到 的資料可以是最新的

12

private boolean writerFirst = true; // 寫入優先 public synchronized void readLock() { try { while(writingWriters > 0 || (writerFirst && waitingWriters > 0)) { wait(); } } catch(InterruptedException e) { e.printStackTrace(); }

readingReaders++; } public synchronized void readUnLock() { readingReaders--; writerFirst = true; notifyAll(); }

public synchronized void writeLock() { waitingWriters++ try { while(readingReaders > 0 || writingWriters > 0) { wait(); } } catch(InterruptedException e) { e.printStackTrace(); } finally { waitingWriters--; }

writingWriters++; } public synchronized void writeUnLock() { writingWriters--; writerFirst = false; notifyAll(); }

Two-phase Termination Mode (1)

所謂的兩階段終止 (Two-phase termination) ,即中止「運作階段」,並完成「善後階段」,完整的完成執行緒的工作

一個執行緒正在週期性的運作,在「運作階段」您送出了停止執行緒的請求,這時候執行緒不該慌張的馬上終止目前的工作,而是先完成這一次週期的工作,然後進入「善後階段」完成一些善後的工作,例如 關閉檔案或網路串流

13

public class SomeThread extends Thread { private boolean isTerminated = false;

public void terminate() { isTerminated = true; }

public void run() { while(!isTerminated) { // ... some statements } } }

Two-phase Termination Mode (2) 14

public class SomeThread extends Thread { private boolean isTerminated = false;

public void terminate() { isTerminated = true; interrupt(); }

public boolean isTerminated() { return isTerminated; }

private void doWorkBeforeShutdown() { // .... do some work before shutdown }

public void run() { try { while(!isTerminated) { // ... some statements } } catch(InterruptedException e) { } finally { doWorkBeforeShutdown(); } } }

Thank You